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

时间:2012-12-16 03:21:07

标签: iphone objective-c ios views

我正在呈现一个模态视图控制器。在该模态视图控制器的viewDidLoad中,我似乎无法找到对父VC的任何引用.... parentViewControllerpresentingViewController等。如果尚未设置,我怎么能得到它的参考?

2 个答案:

答案 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方法找到展示视图控制器的最早时刻。