首页 文章

viewDidAppear没有被调用

提问于
浏览
7

在我的主要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];

6 回答

  • 12

    使用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];
    
  • 0

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

    - (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
    {
        return NO;
    }
    

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

    - (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
    {
        return YES;
    }
    

    但我的子视图控制器肯定会收到 viewWillAppear 调用(如果我明确 automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers 或者如果我完全忽略它的话) .

    Update:

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

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

  • -4

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

    -(void)viewWillAppear:(BOOL)animated {
        [super viewdidAppear:animated]; // this prevented my viewDidAppear method to be called
    }
    
  • 0

    @Rob在Swift 4中回答(这对我的案例有帮助,我将 childViewController 添加到 UITabBarController

    override var shouldAutomaticallyForwardAppearanceMethods: Bool {
        return true
    }
    
  • 4

    我的问题是我正在更改UITabBarController中的选项卡(selectedIndex = x),然后在该选项卡中弄乱子视图控制器 . 问题是它需要以相反的方式完成:首先在其他选项卡中混淆子视图控制器,然后通过设置selectedIndex来更改选项卡 . 在此更改方法之后,viewWillAppear / viewDidAppear开始被正确调用 .

  • 11

    有同样的问题我的容器视图控制器 retain 通过 property 实现了子视图控制器, but 没有将子视图控制器添加到其 childViewControllers array .

    我的解决方案是在容器视图控制器中添加这行代码

    [self addChildViewController: childViewController];
    

    之后 UIKit 开始将外观方法转发到我的子视图控制器,就像预期的那样

    我还将属性属性从 strong 更改为 weak 仅用于美容

相关问题