我正在呈现一个模态视图控制器。在该模态视图控制器的viewDidLoad
中,我似乎无法找到对父VC的任何引用.... parentViewController
,presentingViewController
等。如果尚未设置,我怎么能得到它的参考?
答案 0 :(得分:9)
对于一般解决方案,您可以在第二个控制器中拥有自己的属性,该属性是指向第一个视图控制器的weak
指针。第一个控制器应该在第一个segue的prepareForSegue
中设置第二个控制器的属性。
在回答您的问题时,parentViewController
仅在使用视图控制器包含时设置(您没有这样做)。执行presentingViewController
时会设置presentViewController
,但行为会根据第一个视图控制器是否嵌入导航控制器而更改(如果是嵌入式,则第二个视图控制器的presentingViewController
导航控制器,如果没有,它是你期望它的视图控制器)。如果您执行presentingViewController
,则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
中设置了SecondViewController
属性,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";
答案 1 :(得分:0)
从概念上讲,可以随时加载视图。仅仅因为您的视图已加载并不一定意味着它将以某种形式显示。
您可以使用viewWillAppear:
UIViewController
方法找到展示视图控制器的最早时刻。