何时在模态视图控制器上设置父/呈现视图控制器?
我提出了一个模态视图控制器。 在那个模态视图控制器的viewDidLoad
,我似乎找不到任何对父VC的引用…. parentViewController
, parentViewController
等。如果还没有设置,我该如何获得对它的引用?
对于一般解决方案,您可以在第二个控制器中拥有自己的属性,这是指向第一个视图控制器的weak
指针。 第一个控制器应该在第一个segue的prepareForSegue
设置第二个控制器的属性。
在回答您的问题时,仅在使用视图控制器包含时(您没有这样做)设置parentViewController
。 当你执行presentViewController
, presentViewController
被设置,但是行为会根据第一个视图控制器是否嵌入导航控制器而改变(如果它是嵌入式的,第二个视图控制器的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
方法中找到您的呈现视图控制器的最早点。