我正在展示一个模态视图控制器。在那个模态视图控制器中viewDidLoad
,我似乎找不到对父 VC.... parentViewController
、presentingViewController
等的任何引用。如果尚未设置,我应该如何获得对它的引用?
2 回答
对于一般解决方案,您可以在第二个控制器中拥有自己的属性,它是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
属性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";
从概念上讲,可以随时加载视图。仅仅因为您的视图已加载并不一定意味着它将以某种形式显示。
您可以发现呈现视图控制器的最早点是viewWillAppear:
在UIViewController
.