5

我正在展示一个模态视图控制器。在那个模态视图控制器中viewDidLoad,我似乎找不到对父 VC.... parentViewControllerpresentingViewController等的任何引用。如果尚未设置,我应该如何获得对它的引用?

4

2 回答 2

10

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

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

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


因此,在.h 中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属性SecondViewControllerSecondViewController现在就可以访问属性或调用 的公共方法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";
于 2012-12-16T04:37:13.667 回答
0

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

您可以发现呈现视图控制器的最早点是viewWillAppear:UIViewController.

于 2012-12-16T03:33:24.533 回答