对于一般解决方案,您可以在第二个控制器中拥有自己的属性,即指向第一个视图控制器的 weak 指针。第一个控制器应该在第一个 segue 的prepareForSegue 中设置第二个控制器的属性。
在回答您的问题时,parentViewController 仅在使用视图控制器包含(您没有这样做)时设置。 presentingViewController 是在您执行 presentViewController 时设置的,但行为会根据第一个视图控制器是否嵌入导航控制器而改变(如果嵌入,则第二个视图控制器的 presentingViewController 是导航控制器,如果不是,它就是您期望的视图控制器)。如果您执行pushViewController,则似乎根本没有设置presentingViewController。
底线,如果您在第一个控制器的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];
无论如何,一旦您在SecondViewController 中设置了firstViewController 属性,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";