Iphone 子视图控制器如何使用在Parentviewcontroller中定义的方法
我遇到了这样一种情况,子视图控制器试图显示多个视图控制器,并且在执行此操作时,子视图控制器需要从父视图控制器访问play pause action方法。childviewcontroller可以使用在父视图控制器中定义的播放暂停动作方法,即暂停音频播放器、暂停计时器和暂停层:self.view.layer 我将非常感谢为解决这个问题提供的各种帮助Iphone 子视图控制器如何使用在Parentviewcontroller中定义的方法,iphone,uiviewcontroller,ios6,Iphone,Uiviewcontroller,Ios6,我遇到了这样一种情况,子视图控制器试图显示多个视图控制器,并且在执行此操作时,子视图控制器需要从父视图控制器访问play pause action方法。childviewcontroller可以使用在父视图控制器中定义的播放暂停动作方法,即暂停音频播放器、暂停计时器和暂停层:self.view.layer 我将非常感谢为解决这个问题提供的各种帮助 谢谢您可以使用parentViewController属性访问视图控制器的父级 if([self.parentViewController isKin
谢谢您可以使用
parentViewController
属性访问视图控制器的父级
if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
SomeViewController* viewController = (SomeViewController*)self.parentViewController;
[viewController foo];
}
但是,这取决于视图控制器之间的关系。从你的问题中,我推断你与多个孩子有亲子关系,但如果我错了,请纠正我!这与模态视图控制器演示非常不同,在模态视图控制器演示中,仅显示一个视图控制器,需要用户立即注意
说明:
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);
}
- (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);
}
尽管由于iOS中模式视图控制器模式的流行,可能更常见的是
presentingViewController
,但视图控制器的视图控制器包含父子关系是绝对合法的,从iOS 5开始,UIViewController的parentViewController
和childViewController
属性还没有被弃用,它们的用途刚刚改变。您可以从文档中阅读此摘录:
讨论
如果收件人是容器视图控制器的子级,则此属性将保存它所包含的视图控制器。如果收件人没有父对象,则此属性中的值为零
在iOS 5.0之前,如果视图没有父视图控制器并且正在呈现,则将返回呈现视图控制器。在iOS 5上,这种行为不再发生。相反,请使用presentingViewController属性访问演示视图控制器
每个视图控制器都有一个名为
presentingViewController
(如果ViewController1以模态方式呈现ViewController2,则ViewController1是ViewController2的presentingViewController
)
另一个选项是使用NSNotificationCenter
。然后,您可以在应用程序中的任何位置轻松调用父视图控制器的方法
ParentViewController.m
-(void)viewDidLoad {
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method) name:@"Toggle Play" object:nil];
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"Toggle Play" object:nil];
ChildViewController.m
-(void)viewDidLoad {
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method) name:@"Toggle Play" object:nil];
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"Toggle Play" object:nil];
在
ParentViewController.h
-(void)PlayMusic;
在
ParentViewController.m
-(IBAction)PlayMusic:(id)sender {
[self playMusic];
}
在子视图控制器上播放按钮的iAction
处执行以下操作:
-(IBAction)PlayMusic:(id)sender {
ParentViewController *parent=self.parentViewController;
[parent playMusic];
}
您可以从子级访问父级,即使父级是
UINavigationController
或UIViewController
,也可以使用以下命令:
self.parentViewController
你可以像这样往上走
self.parentViewController!.parentViewController as! PARENT_VIEW_CONTROLLER
@尼尔斯博特你能澄清这个问题吗?没问题——我提供了另一个选择。您可以将响应程序链想象为委托方法调用的另一种方式,在本例中,委托是响应程序链上的一个对象(您不关心哪个)。这不需要了解所包含的视图/视图控制器,也不需要预先安排(添加通知观察者)。此外,我注意到
UIResponder
缺少nsrresponder
的-tryToPerform:with:
。。。这很容易通过分类添加。杰克,你错了<代码>parentViewController在iOS 5中未被弃用。父子关系和呈现关系是两种完全不同的视图控制器关系。当一个或多个视图控制器作为子视图添加到一个父视图控制器时,将使用父子关系。当视图控制器以模态方式呈现单个视图控制器时,您就具有呈现关系。文档:请参阅对我答案的编辑以获得更详细的解释,我在这里只有600个字符!杰克指出,parentViewController
已被弃用。parentViewController
未被弃用。它的使用在iOS 5中确实发生了变化,但它仍然有特定的用途。您可以回顾上一个关于堆栈溢出的问题,该问题询问视图控制器包含(其中使用了parentViewController属性,而不是presentingViewController),这似乎是OP在以下链接询问的内容:@Rickay我错了,我误读了!我将取消你的否决票,并为你的麻烦投上你的答案。