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

我将一个子视图控制器添加到父视图控制器,并且一切按预期工作,除了子视图控制器没有触发其通常的callback。 例如,像viewWillAppear(animation)的东西永远不会被调用。 我看着它,并认为这可能是因为我没有分别将其添加到父级之前和之后调用子视图控制器上的willMoveToParentViewController和didMoveToParentViewController。 不幸的是,修复没有任何区别。 有谁知道我怎么可以连接这个,所以当我做addChildViewController和removeChildViewController常规callback触发? 在添加childViewController之后,我还将其视图作为子视图添加到父视图控制器的视图中。 在任何一点(addChildViewController&addSubview)子视图控制器的viewWillAppear(animation)等方法被调用…

缺口

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

viewWillDisappearviewDidDisappear从视图层次结构中移除ViewControler视图时自动调用

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

当你的主视图控制器出现或消失,你应该以相应的方法调用这个方法的孩子。

不知道这是否适用于您的情况,但尝试尝试手动发送外观callback方法给您的孩子。

从苹果的视图控制器遏制文件 :

但是,有时默认行为可能会以对您的容器无意义的顺序发送这些事件。 例如,如果多个孩子同时改变其视图状态,则可能需要合并这些更改,以使外观callback都以更合理的顺序同时发生。 要做到这一点,你需要修改你的容器类来接pipe外观或者旋转callback的责任。

它build议手动将外观callback转发给你的孩子,如果你想更细粒度的控制:

// 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]; } 

试试这个:

 childController.willMoveToParentViewController(self) childController.beginAppearanceTransition(true, animated: true) 

添加到您的视图控制器后

只是尝试在父视图控制器viewDidLoad中执行以下操作,它似乎工作

 ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init]; [self addChildViewController:child]; [self.view addSubview:child.view]; [child didMoveToParentViewController:self]; 
 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) 

Chourobin在Swift中的回答 :

 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() } 

PS由于我没有把儿童VC作为一种财产或variables。 我更喜欢使用当前select的段索引访问它。 SegmentView是第三方的UISegmentControl

你可以手动调用子视图控制器的viewWillAppear在parectViewController中,这样的代码

 -(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]; } 

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