viewDidAppear没有被调用
在我的主UIViewController我添加一个主屏幕视图控制器作为子视图的:
UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:vc]; controller.navigationBarHidden = YES; controller.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); [self addChildViewController:controller]; [self.view insertSubview:controller.view atIndex:0]; [controller didMoveToParentViewController:self];
问题是viewDidAppear和viewWillAppear只调用一次,就像viewDidLoad一样。 为什么是这样? 我如何使这个工作?
基本上vc里面我没有得到viewDidAppear也viewWillAppear。
我也只是尝试添加UIViewController没有导航控制器,它仍然无法正常工作:
vc.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); [self addChildViewController:vc]; [self.view insertSubview:vc.view atIndex:0]; [vc didMoveToParentViewController:self];
使用presentModalViewController或segues或pushViewController来呈现视图控制器应该修复它。
或者,如果由于某种原因,您想要在不使用内置方法的情况下呈现视图,则应该在自己的代码中手动调用这些方法。 像这样的东西:
[self addChildViewController:controller]; BOOL animated = NO; [controller viewWillAppear:animated]; [self.view insertSubview:controller.view atIndex:0]; [controller viewDidAppear:animated]; [controller didMoveToParentViewController:self];
我可以重现没有收到外观方法的子控制器的问题的唯一方法是如果容器视图控制器执行以下操作(我相信你没有):
- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers { return NO; }
也许你可以尝试明确地启用这个:
- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers { return YES; }
但是,我的子视图控制器肯定是得到viewWillAppear
调用(或者如果我明确automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
viewWillAppear
或如果我完全省略。
更新:
好吧,看你原来的问题下的意见,看来问题是,子控制器(B)本身是一个容器视图控制器(这是完全可以接受的)呈现另一个子控制器(C)。 而这个控制器B的自己的子控制器C正在被删除,你想知道为什么你没有得到viewWillAppear
或viewDidAppear
容器控制器B.容器控制器不会得到这些外观方法,当他们的孩子被删除(或更准确地说,因为容器应该移除孩子,而不是孩子自己移除,当容器移走孩子时,它不会收到外观方法)。
如果我误解了这个情况,请告诉我。
在我的例子中,viewDidAppear没有被调用,因为我在viewWillAppear方法中犯了不必要的错误。
-(void)viewWillAppear:(BOOL)animated { [super viewdidAppear:animated]; // this prevented my viewDidAppear method to be called }
@Rob答案在Swift 4(帮助我的情况下,我添加一个childViewController
到UITabBarController
)
override var shouldAutomaticallyForwardAppearanceMethods: Bool { return true }
我的问题是,我正在更改UITabBarController(selectedIndex = x)中的选项卡,然后在该选项卡中的子视图控制器。 问题在于需要反过来:先在其他选项卡中的子视图控制器弄乱,然后通过设置selectedIndex来更改选项卡。 在这个更改方法之后,viewWillAppear / viewDidAppear开始被正确调用。
有一个相同的问题我的容器视图控制器通过一个property
retain
一个子视图控制器, 但没有添加一个子视图控制器到它的childViewControllers
array
。
我的解决scheme是在容器视图控制器中添加这一行代码
[self addChildViewController: childViewController];
之后UIKit
开始转发外观方法到我的子视图控制器正如所料
为了美,我也把财产属性由strong
转为了weak