在容器视图中的视图控制器中,如何访问包含容器的视图控制器?

Mar*_*ges 52 containers view storyboard ipad ios

这很难说,但我有一个包含容器视图的视图控制器(vc1)(我正在使用故事板).在该容器视图中是导航控制器和根视图控制器(vc2).

从vc2中我怎样才能访问vc1?

或者,如何将vc1传递给vc2?(记住我正在使用故事板).

Bon*_*nie 51

您可以prepareForSegue在Vc1中使用该 方法,因为当ContainerViewController成为子项时会发生嵌入segue.您可以将self作为obj传递或存储对子项的引用以供以后使用.

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSString * segueName = segue.identifier;
    if ([segueName isEqualToString: @"embedseg"]) {
        UINavigationController * navViewController = (UINavigationController *) [segue destinationViewController];
        Vc2 *detail=[navViewController viewControllers][0];
        Vc2.parentController=self;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:次要代码修复


Fir*_*ula 17

要从子视图控制器中访问父视图控制器,必须覆盖didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent {
    [super didMoveToParentViewController:parent];

    //Use parent
}
Run Code Online (Sandbox Code Playgroud)

在Xcode Command +上单击此方法以获取更多信息:

这两个方法是公共的,用于在子控制器之间转换时调用的容器子类.如果它们被覆盖,则覆盖应确保调用超级.从子父中删除子项时,这两种方法中的父参数都是nil; 否则它等于新的父视图控制器.

addChildViewController:在添加子项之前调用[child willMoveToParentViewController:self].但是,它不会调用didMoveToParentViewController:.预计容器视图控制器子类将在转换到新子项完成后进行此调用,或者在没有转换的情况下,在调用addChildViewController后立即执行此调用:类似地,removeFromParentViewController:在删除子项之前不调用[self willMoveToParentViewController:nil].这也是容器子类的责任.容器子类通常通过首先调用addChildViewController:来定义一个转换为新子节点的方法,然后执行一个转换,将新子视图添加到其父视图层次结构中,最后将调用didMoveToParentViewController:.类似地,子类通常会定义一个方法,通过首先调用[child willMoveToParentViewController:nil]以相反的方式移除子节点.


osr*_*srl 10

您可以使用Bonnie使用的相同方法使用委托.这是你如何做到的:

在您的containerViews ViewController中:

class ContainerViewViewController: UIViewController {
   //viewDidLoad and other methods

   var delegate: ContainerViewControllerProtocol?

   @IBAction func someButtonTouched(sender: AnyObject) { 
    self.delegate?.someDelegateMethod() //call this anywhere
   }

}

protocol ContainerViewControllerProtocol {
    func someDelegateMethod()
}
Run Code Online (Sandbox Code Playgroud)

在您的父ViewController中:

class ParentViewController: UIViewController, ContainerViewControllerProtocol {
   //viewDidLoad and other methods

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "filterEmbedSegue" {
            let containerViewViewController = segue.destinationViewController as ContainerViewViewController

            containerViewViewController.delegate = self
        }
    }

    func someDelegateMethod() {
        //do your thing
    }
}
Run Code Online (Sandbox Code Playgroud)


Bor*_*rzh 10

使用属性parentViewControllerself.parentViewController

  • 在我的情况下,这不起作用,因为self.parentViewController是零.我在storyboard中添加了containerView,然后将关联的视图控制器类设置为我的特定子类.我希望将parentViewController设置为包含容器视图的VC,但这不是自动设置的.我不得不使用上面的-prepareForSegue解决方案 (8认同)