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

Aar*_*ron 5 iphone views objective-c ios

我提出了一个模态视图控制器.在这种模式视图控制器viewDidLoad,我似乎无法找到父VC ....任何引用parentViewController,presentingViewController等等.如果这还没有设置,我怎么得到它的参考?

Rob*_*Rob 10

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

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

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


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

@class FirstViewController;

@interface SecondViewController : UIViewController

@property (nonatomic, weak) FirstViewController *firstViewController;

@end
Run Code Online (Sandbox Code Playgroud)

然后在第一个视图控制器中,我有一个prepareForSegue看起来像:

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

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

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
controller.firstViewController = self;
[self presentViewController:controller animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

无论如何,一旦你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";
Run Code Online (Sandbox Code Playgroud)