2015-03-26 14 views
7

Per prima cosa, creo un MainViewController. Poi, nel MainViewController, faccioViewDidAppear non chiamato quando la vista modale viene chiusa

[self presentViewController:modalViewController animated:YES completion:nil]; 
modalViewController.modalPresentationStyle = UIModalPresentationFormSheet; 

Quando ho respingere il modalViewController, su iPhone (tranne iPhone 6+), viewDidAppear di MainViewController si chiama. Su iPad e iPhone 6+, viewDidAppear di MainViewController non viene chiamato.

La logica è chiamare una funzione quando il modalViewController viene chiuso. Come posso sapere quando il modalViewController è stato rimosso.

+0

Prova ad usare un altro 'modalPresentationStyle'. Funziona allora? – itsji10dra

+0

Richiesto da UX. Non posso cambiarlo – Gonghan

+0

Stai chiamando: [super viewDidAppear: animated]; – itsji10dra

risposta

4

È possibile utilizzare un delegato per chiamare la propria funzione in MainViewController quando si chiude il controller della vista modale. Ad esempio:

MainViewController.h:

@protocol YourDelegate <NSObject> 
- (void)someFunction; 
@end 

@interface MainViewController : UIViewController <YourDelegate> 

@end 

MainViewController.m:

// Where you present the modal view 
ModalViewController *view = [[ModalViewController alloc] init]; 
view.delegate = self; 
[self presentViewController:view animated:YES completion:nil]; 

ModalViewController.h:

@interface ModalViewController : UIViewController 
@property (nonatomic, weak) id<YourDelegate> delegate; 
@end 

ModalViewController.m

// Wherever you dismiss.. 
[self dismissViewControllerAnimated:YES completion:^{ 
    [self.delegate someFunction]; 
} 
+0

e se il progetto utilizza storyboard + segues? Intendo la situazione quando il seguito è definito nello storyboard, non nel codice –

3

Il modo in cui i controller di visualizzazione forniti da Apple è avere un delegato sul controller di visualizzazione presentato, chiamato quando il controller di visualizzazione richiede di essere chiuso. Quindi, il relatore sarebbe responsabile per il licenziamento del controller e, quindi, saprebbe anche quando eseguire qualsiasi ripulitura associata (sia prima che dopo l'animazione).