viewDidAppear没有被调用

xon*_*rlz 8 iphone objective-c ipad ios

在我的主要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];    
Run Code Online (Sandbox Code Playgroud)

问题是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];    
Run Code Online (Sandbox Code Playgroud)

luk*_*uky 21

在我的情况下,没有调用viewDidAppear,因为我在viewWillAppear方法中犯了不必要的错误.

-(void)viewWillAppear:(BOOL)animated {
    [super viewdidAppear:animated]; // this prevented my viewDidAppear method to be called
}
Run Code Online (Sandbox Code Playgroud)

  • 不敢相信我也做到了这一点......难怪找到遇到类似问题的人真是太难了! (3认同)

Rob*_*Rob 13

我可以重现子控制器没有接收外观方法问题的唯一方法是容器视图控制器执行以下操作(我确定您没有这样做):

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

也许您可以尝试明确启用此功能:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但我的孩子视图控制器肯定是在viewWillAppear接听电话(如果我明确automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers或者我完全省略了这一点.

更新:

好的,看看原始问题下的评论,问题似乎是所讨论的子控制器(B)本身是一个容器视图控制器(完全可以接受),它呈现另一个子控制器(C).并且这个控制器B自己的子控制器C正在被移除,你想知道为什么你没有得到viewWillAppearviewDidAppear为容器控制器B.容器控制器在他们的孩子被移除时没有得到这些外观方法(或者更准确地说,因为容器应该移除儿童,而不是儿童自行移除,当容器移除儿童时,它不会接受外观方法).

如果我误解了这种情况,请告诉我.


Iva*_*ino 7

@Rob在Swift 4中回答(这对我的情况有所帮助,我正在添加childViewController一个UITabBarController)

override var shouldAutomaticallyForwardAppearanceMethods: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lin -10

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

  • 我同意 @Rob 的观点,需要手动调用 `viewWillAppear:` 和 `viewDidAppear:` 是“一个更大问题的症状”,这个 hack 没有解决这个问题,应该避免。 (2认同)
  • 您永远不应该手动调用“viewWillAppear:”等方法,请考虑使用“beginAppearanceTransition:animated:”、“endAppearanceTransition”方法 (2认同)