iOS路由viewDidAppear到子视图控制器?

时间:2013-12-24 02:15:34

标签: ios viewwillappear childviewcontroller

我正在将父视图控制器添加到父视图控制器,并且一切都按预期工作,除了子视图控制器没有触发其通常的回调。例如,从未调用像viewWillAppear(动画)这样的东西。我调查了一下,并认为这可能是因为我没有在子视图控制器上分别将它添加到父视图之前和之后调用willMoveToParentViewController和didMoveToParentViewController。不幸的是,修复没有任何区别。有没有人知道如何连接它,以便当我执行addChildViewController和removeChildViewController时,会触发常规回调?添加childViewController后,我还将其视图作为子视图添加到父视图控制器的视图中。在任何一点(addChildViewController& addSubview)都会调用子视图控制器的viewWillAppear(动画)等方法...

尼克

7 个答案:

答案 0 :(得分:11)

将ViewControler视图添加到视图层次结构时,

viewWillAppear viewDIdAppear 会自动调用

从视图层次结构中删除ViewControler视图时,会自动调用

viewWillDisappear viewDidDisappear

也许这个方法没有被调用,因为你在显示主视图控制器之前添加了子控制器视图,因此你的主视图不在视图中了吗?

当您的主视图控制器出现或消失时,您应该在相应的方法中为子项调用此方法。

答案 1 :(得分:7)

不确定这是否适用于您的情况,但尝试尝试手动向您的孩子发送外观回调方法。

来自apple的视图控制器控件documentation

  

但是,有时默认行为可能会发送这些事件   对您的容器没有意义的订单。例如,如果   多个孩子同时改变他们的观点状态,你   可能想要合并更改以便外观回调   所有这些都以更合乎逻辑的顺序同时发生。要做到这一点,你   修改容器类以接管外观责任   或轮换回调。

如果您想要更细粒度的控制,建议手动将外观回调转发给您的孩子:

// From the container view controller
- (BOOL) shouldAutomaticallyForwardAppearanceMethods
{
    return NO;
}

-(void) viewWillAppear:(BOOL)animated
{
    [self.child beginAppearanceTransition: YES animated: animated];
}

-(void) viewDidAppear:(BOOL)animated
{
    [self.child endAppearanceTransition];
}

-(void) viewWillDisappear:(BOOL)animated
{
    [self.child beginAppearanceTransition: NO animated: animated];
}

-(void) viewDidDisappear:(BOOL)animated
{
    [self.child endAppearanceTransition];
}

答案 2 :(得分:7)

试试这个:

childController.willMoveToParentViewController(self)
childController.beginAppearanceTransition(true, animated: true)
添加到视图控制器后

答案 3 :(得分:4)

刚尝试在父视图控制器中的viewDidLoad中执行以下操作,它似乎正常工作

ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init];
[self addChildViewController:child];
[self.view addSubview:child.view];
[child didMoveToParentViewController:self];

答案 4 :(得分:0)

let vc = ChildVC.init()
vc.frame = self.view.bounds
self.addChildViewController(vc)
self.view.addSubview(vc.view)
vc.willMove(toParentViewController: self)
vc.didMove(toParentViewController: self)

答案 5 :(得分:0)

Swift中的

Chourobin answer

override var shouldAutomaticallyForwardAppearanceMethods: Bool {
    return false
}

override func viewWillAppear(_ animated: Bool) {
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(true, animated: animated)
}

override func viewDidAppear(_ animated: Bool) {
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition()
}

override func viewWillDisappear(_ animated: Bool) {
    self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(false, animated: animated)
}

override func viewDidDisappear(_ animated: Bool) {
    self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition()
}

<子> P.S。因为我没有将对VC的引用保留为属性或变量。我更喜欢使用当前选择的段索引来访问它。 SegmentView是第三方UISegmentControl

答案 6 :(得分:-4)

您可以在parectViewController中手动调用子视图控制器的viewWillAppear,代码如下

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [selectedViewController viewWillAppear:animated];
}

如果你已经将navigationController添加为childViewController,你可以在navigationController的委托中添加这样的代码

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    [viewController viewWillAppear:animated];
}

如果你已经将tabBarController添加为childViewController,你可以在tabBarController的委托和超级视图中添加这样的代码

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tabBarController.selectedViewController viewWillAppear:animated]; 
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    [viewController viewWillAppear:NO]; 
}

我不知道这是否可以解决您的问题,希望能够帮助您。