viewDidAppear没有被调用

时间:2012-07-18 00:42:24

标签: iphone objective-c ios ipad

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

8 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:13)

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return NO;
}

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return YES;
}

但我的子视图控制器肯定会收到viewWillAppear调用(如果我明确automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers或者我完全忽略了这一点。

<强>更新

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

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

答案 2 :(得分:5)

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

override var shouldAutomaticallyForwardAppearanceMethods: Bool {
    return true
}

答案 3 :(得分:2)

另一种情况是,如果您将UINavigationController子类化,并且您的子类覆盖

,则在启动时不会调用此方法(但可能会在您返回视图时调用)。

-(void)viewDidAppear:(BOOL)animated

但无法致电[super viewDidAppear:animated];

答案 4 :(得分:1)

有同样的问题 我的容器视图控制器通过new Image() retain子视图控制器,但未向其property childViewControllers添加子视图控制器。

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

array

之后[self addChildViewController: childViewController]; 开始将外观方法转发到我的子视图控制器,就像预期一样

我还将属性属性从UIKit更改为strong只是为了美容

答案 5 :(得分:0)

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

答案 6 :(得分:0)

将代码更新为13.0时,我丢失了viewDidAppear调用。

在Objective-c中,我的解决方案是将以下所有覆盖均添加到父主视图控制器中。

这允许ViewDidAppear调用再次被调用...就像在以前的IOS(12和更早版本)中一样。

@implementation MasterViewController

// ....某些方法

  • (BOOL)应该自动转发外观方法{ 返回是; }

// ...某些方法

@end

答案 7 :(得分:-7)

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