2012-12-16 11 views
5

Ich präsentiere einen Modal View Controller. In diesem Modal-View-Controller viewDidLoad, kann ich nicht scheinen, einen Verweis auf den übergeordneten VC zu finden .... parentViewController, presentingViewController, etc. Wenn dies noch nicht festgelegt ist, wie soll ich einen Verweis darauf erhalten?Wann ist der übergeordnete/präsentierende View-Controller auf einem Modal View-Controller eingestellt?

+1

kurz gesagt, habe ich, dass 'presentingViewController' arbeitet (in storyboards, zumindest) gefunden, wenn die ersten view-Controller nicht in einer Navigationssteuerung eingebettet ist, aber wenn es ist, erhalten Sie die Navigationssteuerung. Sie können Spiele spielen, um zu versuchen, den logischen präsentierenden View-Controller zu finden, aber ich denke, es ist einfach viel besser, eine eigene Property in Ihrem präsentierten View-Controller zu haben, die der präsentierende View-Controller einstellt. – Rob

Antwort

8

Für eine allgemeine Lösung könnten Sie Ihre eigene Eigenschaft im zweiten Controller haben, der ein weak Zeiger auf den ersten View-Controller ist. Der erste Controller sollte die Eigenschaft des zweiten Controllers im ersten Segment prepareForSegue festlegen.

Als Antwort auf Ihre Frage, parentViewController wird nur eingestellt, wenn View-Controller-Eindämmung verwenden (was Sie nicht tun). Die presentingViewController wird festgelegt, wenn Sie presentViewController tun, aber das Verhalten ändert sich abhängig davon, ob der erste View-Controller in einem Navigationscontroller eingebettet ist oder nicht (wenn es eingebettet ist, ist der presentingViewController der Navigationscontroller, wenn nicht, ist es der View Controller, den Sie erwarten würden). Und es scheint, dass presentingViewController nicht eingestellt ist, wenn Sie pushViewController tun.

Fazit, ich finde es viel zuverlässiger und konsistenter, wenn Sie eine benutzerdefinierte Eigenschaft des zweiten Controllers während der prepareForSegue in der ersten Controller festlegen.


Also, in der SecondViewController, habe ich eine .h @interface, die wie folgt aussieht:

@class FirstViewController; 

@interface SecondViewController : UIViewController 

@property (nonatomic, weak) FirstViewController *firstViewController; 

@end 

Und dann in der ersten View-Controller, ich prepareForSegue haben, die wie folgt aussieht:

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

Offensichtlich gilt dieser obige Punkt, wenn Sie Storyboards verwenden. Wenn Sie NIBs verwenden, würden Sie so etwas wie:

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

Wie auch immer, wenn Sie festgelegt haben, dass firstViewController Eigenschaft in Ihrem SecondViewController, dass SecondViewController jetzt können Eigenschaften zugreifen oder rufen öffentliche Methoden des FirstViewController, wie :

// 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

Konzeptionell kann eine Ansicht jederzeit geladen werden. Nur weil Ihre Ansicht geladen wurde, heißt das nicht unbedingt, dass sie in irgendeiner Form angezeigt wird.

Der früheste Punkt, an dem Sie Ihren präsentierenden View-Controller erkennen können, ist in der viewWillAppear:-Methode von UIViewController.

Verwandte Themen