Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 子视图控制器如何使用在Parentviewcontroller中定义的方法_Iphone_Uiviewcontroller_Ios6 - Fatal编程技术网

Iphone 子视图控制器如何使用在Parentviewcontroller中定义的方法

Iphone 子视图控制器如何使用在Parentviewcontroller中定义的方法,iphone,uiviewcontroller,ios6,Iphone,Uiviewcontroller,Ios6,我遇到了这样一种情况,子视图控制器试图显示多个视图控制器,并且在执行此操作时,子视图控制器需要从父视图控制器访问play pause action方法。childviewcontroller可以使用在父视图控制器中定义的播放暂停动作方法,即暂停音频播放器、暂停计时器和暂停层:self.view.layer 我将非常感谢为解决这个问题提供的各种帮助 谢谢您可以使用parentViewController属性访问视图控制器的父级 if([self.parentViewController isKin

我遇到了这样一种情况,子视图控制器试图显示多个视图控制器,并且在执行此操作时,子视图控制器需要从父视图控制器访问play pause action方法。childviewcontroller可以使用在父视图控制器中定义的播放暂停动作方法,即暂停音频播放器、暂停计时器和暂停层:self.view.layer

我将非常感谢为解决这个问题提供的各种帮助


谢谢

您可以使用
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我错了,我误读了!我将取消你的否决票,并为你的麻烦投上你的答案。