您可以使用以下命令访问视图控制器的父级parentViewController
财产。
if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
SomeViewController* viewController = (SomeViewController*)self.parentViewController;
[viewController foo];
}
但是,这取决于视图控制器之间的关系。从你的问题我推断你是有多个孩子的亲子关系,如有错误请指正!这与模态视图控制器呈现非常不同,在模态视图控制器呈现中仅呈现一个视图控制器并且需要用户立即注意。
解释:
对于两者之间的区别似乎有些混乱parentViewController
and presentingViewController
UIViewController 上的属性。有两种不同的视图控制器关系,每种关系都适用于这些属性之一。
如果您希望添加多个视图控制器的视图作为父视图控制器的子视图,您可以使用视图控制器遏制 https://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5。在这种情况下,任何作为父视图控制器的子视图(子视图)添加的视图都将返回父视图控制器(控制子视图的父视图;父视图)。parentViewController
属性被访问。在这种情况下,presentingViewController
财产回报null
.
例如,在父视图控制器中:
- (void)viewDidLoad {
[super viewDidLoad];
SomeViewController* someVC = [[SomeViewController alloc] init];
[self addChildViewController:someVC];
[self.view addSubview:someVC.view];
[someVC.view setFrame:<SOME_FRAME>];
[someVC didMoveToParentViewController:self];
AnotherViewController* anotherVC = [[AnotherViewController alloc] init];
[self addChildViewController:anotherVC];
[self.view addSubview:anotherVC.view];
[anotherVC.view setFrame:<ANOTHER_FRAME>];
[anotherVC didMoveToParentViewController:self];
/* this prints self */
NSLog(@"%@", someVC.parentViewController);
/* this prints null */
NSLog(@"%@", someVC.presentingViewController);
/* this prints self */
NSLog(@"%@", anotherVC.parentViewController);
/* this prints null */
NSLog(@"%@", anotherVC.presentingViewController);
}
相反,如果您只是希望呈现一个单一的模态视图控制器(这种情况比上面的一对多父子关系更常见),那么presentingViewController
财产被使用。
例如,在呈现视图控制器中:
- (void)someActionTriggered {
SomeViewController* viewController = [[SomeViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
/* this prints null */
NSLog(@"%@", viewController.parentViewController);
/* this prints self, or a tab bar controller if 'self' is contained in one */
NSLog(@"%@", viewController.presentingViewController);
}
虽然presentingViewController
由于 iOS 中模态视图控制器模式的盛行,视图控制器包含父子关系是绝对合法的,并且视图控制器的父子关系是绝对合法的。parentViewController
and childViewController
UIViewController 的属性有not自 iOS 5 起已被弃用,它们的用途刚刚发生了变化。您可以阅读文档中的这段摘录:
讨论
如果接收者是容器视图控制器的子级,则此属性保存其所在的视图控制器。如果接收者没有父级,则此属性中的值为 nil。
在 iOS 5.0 之前,如果视图没有父视图控制器并且正在呈现,则将返回呈现的视图控制器。在 iOS 5 上,此行为不再发生。相反,使用presentingViewController 属性来访问呈现视图控制器。