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

pac*_*hun 9 viewwillappear ios childviewcontroller

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

缺口

VCh*_*zov 11

viewWillAppear,viewDdAppear在您将ViewControler视图添加到视图层次结构时自动调用

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

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

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


cho*_*bin 7

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

从apple的视图控制器包含文档:

但是,有时默认行为可能会按照对容器没有意义的顺序发送这些事件.例如,如果多个子节点同时更改其视图状态,您可能希望合并更改,以便外观回调全部以更符合逻辑的顺序同时发生.为此,您需要修改容器类以接管外观或旋转回调的责任.

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

// 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];
}
Run Code Online (Sandbox Code Playgroud)


小智 7

试试这个:

childController.willMoveToParentViewController(self)
childController.beginAppearanceTransition(true, animated: true)
Run Code Online (Sandbox Code Playgroud)

添加到视图控制器后


小智 4

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

ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init];
[self addChildViewController:child];
[self.view addSubview:child.view];
[child didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)