use*_*248 3 iphone uiviewcontroller ios6
我有一种情况,其中子视图控制器正在尝试显示多个视图控制器,并且在执行该子视图控制器时需要从父视图控制器访问播放暂停操作方法.如何实现暂停音频播放器,暂停计时器和暂停层的播放暂停动作方法:self.view.layer并在父视图控制器中定义,可以由childviewcontroller使用.
我将非常感谢各种帮助来解决这个问题.
谢谢
您可以使用该parentViewController属性访问视图控制器的父级.
if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
SomeViewController* viewController = (SomeViewController*)self.parentViewController;
[viewController foo];
}
Run Code Online (Sandbox Code Playgroud)
但是,这取决于视图控制器之间的关系.从你的问题,我推断你与多个孩子有亲子关系,但如果我错了请纠正我!这与模态视图控制器演示非常不同,其中仅呈现一个视图控制器并且它要求用户立即注意.
说明:
关于UIViewController上的属性parentViewController和presentingViewController属性之间的区别似乎有些混乱.有两种不同的视图控制器关系,每种关系适用于其中一个属性.
如果要将多个视图控制器的视图添加为父视图控制器的子视图,则使用视图控制器包含.在这种情况下,作为父视图控制器的子视图(子级)添加的任何视图将在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);
}
Run Code Online (Sandbox Code Playgroud)
相反,如果您只是希望呈现单个模态视图控制器(比上面的一对多父子关系更常见的情况),则使用该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);
}
Run Code Online (Sandbox Code Playgroud)
虽然presentingViewController可能更常见的是由于iOS的模态视图控制器模式的盛行,视图控制器的视图控制器遏制亲子关系是绝对合法的,并且parentViewController和childViewController一个UIViewController的性质已经不被弃用的iOS 5,他们的使用刚刚改变了.您可以从文档中阅读此摘录:
讨论
如果收件人是容器视图控制器的子级,则此属性包含其所包含的视图控制器.如果收件人没有父级,则此属性中的值为nil.
在iOS 5.0之前,如果视图没有父视图控制器并且正在呈现,则将返回呈现视图控制器.在iOS 5上,不再出现此行为.而是使用presentViewController属性来访问呈现视图控制器.