2012-12-16 6 views
5

Ho presentato un controller di visualizzazione modale. In quella modal view controller viewDidLoad, non riesco a trovare alcun riferimento al VC genitore ... parentViewController, presentingViewController, ecc. Se questo non è ancora impostato, come dovrei ottenere un riferimento ad esso?Quando il controllore della vista principale/presentatore è impostato su un controller della vista modale?

+1

in breve, ho trovato che 'presentingViewController' lavora (in storyboard, almeno) se il primo controller della vista non è incorporato in un controller di navigazione, ma se lo è, si ottiene il controller di navigazione. Puoi giocare ai giochi per cercare di capire il logico controller di presentazione, ma penso che sia molto meglio avere la tua proprietà nel controller di visualizzazione presentato che il controller di visualizzazione presenterà. – Rob

risposta

8

Per una soluzione generale, è possibile avere una proprietà nel secondo controller, che è un puntatore weak per il primo controller di visualizzazione. Il primo controller dovrebbe impostare la proprietà del secondo controller nei primi passi prepareForSegue.

In risposta alla tua domanda, parentViewController viene impostato solo quando si utilizza il contenimento del controller di visualizzazione (cosa che non si sta facendo). Il presentingViewController viene impostato quando si esegue presentViewController, ma il comportamento cambia a seconda che il controller della prima vista sia incorporato in un controller di navigazione o meno (se è incorporato, il controller della vista seconda presentingViewController è il controller di navigazione, in caso contrario, è il guarda il controller che ti aspetteresti che sia). E sembra che presentingViewController non sia impostato affatto se lo fai pushViewController.

In conclusione, trovo che sia molto più affidabile e coerente se si imposta una proprietà personalizzata del secondo controller durante il prepareForSegue nel primo controller.


Così, nel SecondViewController, ho un .h @interface che assomiglia a:

@class FirstViewController; 

@interface SecondViewController : UIViewController 

@property (nonatomic, weak) FirstViewController *firstViewController; 

@end 

E poi nel primo controller di vista, ho un prepareForSegue che assomiglia:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"IdentifierForSegueToSecondControllerHere"]) 
    { 
     SecondViewController *controller = segue.destinationViewController; 
     controller.firstViewController = self; 
    } 
} 

Ovviamente, il suddetto punto si applica se si utilizzano gli storyboard. Se stai usando ONA, si potrebbe fare qualcosa di simile:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil]; 
controller.firstViewController = self; 
[self presentViewController:controller animated:YES completion:nil]; 

Comunque, una volta che hai impostato che firstViewController proprietà nel vostro SecondViewController, che SecondViewController possono ora accedere alle proprietà o invocare metodi pubblici della FirstViewController, come ad esempio :

// up at the top, where you have your import statements, include the following 

#import "FirstViewController.h" 

// then, in the @implementation of the SecondViewController, you can reference 
// the first view controller and its properties, such as: 

self.firstViewController.someStringProperty = @"some value"; 
0

Concettualmente, una vista può essere caricata in qualsiasi momento. Solo perché la tua vista è stata caricata non significa necessariamente che sta per essere visualizzata in qualche modo.

Il primo punto in cui è possibile scoprire il controller di visualizzazione che si presenta è nel metodo viewWillAppear: di UIViewController.