对于一般解决方案,您可以在第二个控制器中拥有自己的属性,它是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
, that 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";