何时在模态视图控制器上设置父/呈现视图控制器?

我提出了一个模态视图控制器。 在那个模态视图控制器的viewDidLoad ,我似乎找不到任何对父VC的引用…. parentViewControllerparentViewController等。如果还没有设置,我该如何获得对它的引用?

对于一般解决方案,您可以在第二个控制器中拥有自己的属性,这是指向第一个视图控制器的weak指针。 第一个控制器应该在第一个segue的prepareForSegue设置第二个控制器的属性。

在回答您的问题时,仅在使用视图控制器包含时(您没有这样做)设置parentViewController 。 当你执行presentViewControllerpresentViewController被设置,但是行为会根据第一个视图控制器是否嵌入导航控制器而改变(如果它是嵌入式的,第二个视图控制器的presentingViewController是导航控制器,如果不是,它就是查看控制器,你期望它是)。 如果你做pushViewController ,似乎根本没有设置pushViewController

最重要的是,如果在第一个控制器的prepareForSegue期间设置第二个控制器的自定义属性,我发现它更加可靠和一致。


所以,在SecondViewController ,我有一个.h @interface ,看起来像:

 @class FirstViewController; @interface SecondViewController : UIViewController @property (nonatomic, weak) FirstViewController *firstViewController; @end 

然后在第一个视图控制器中,我有一个prepareForSegue ,如下所示:

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

显然,如果您使用故事板,则上述要点适用。 如果您正在使用NIB,您可以执行以下操作:

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

无论如何,一旦你在firstViewController中设置了firstViewController属性, SecondViewController现在可以访问属性或调用FirstViewController公共方法,例如:

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

从概念上讲,可以随时加载视图。 仅仅因为您的视图已加载并不一定意味着它将以某种forms显示。

您可以在viewWillAppear: UIViewController方法中找到您的呈现视图控制器的最早点。