为什么不调用viewWillDisappear或viewDidAppear?

时间:2010-11-27 01:33:51

标签: iphone ipad ios uiviewcontroller

我有一个UINavigationController,其中UITableView是我的主菜单。用户单击一个单元格,并在堆栈上推送新视图。在一个案例中,我推送另一个需要工具栏的UITableView。因此,在第二个tableView的init上,我使用正确的项设置self.toolbarItems属性。但是我需要致电[self.navigationController setToolbarHidden:NO animated:YES];所以在viewDidAppearviewWillAppear方法中调用它是有意义的。但我把它放在那些方法中并找出(也是通过NSLog)它们永远不会被调用。将其隐藏在viewWillDisappearviewDidDisappear中也是如此。为什么不调用这些方法?我应该在哪里隐藏/显示工具栏呢?

4 个答案:

答案 0 :(得分:18)

我注意到行为,如果父控制器(如UINavigationControllerUITabBarController)从未调用它viewWill/DidAppear,它也不会在子控制器上调用它。因此,请确保在创建父控制器的代码中,调用viewWillAppear,显示它,然后调用viewDidAppear。然后它应该在适当的时候对它的子控制器进行调用。

仔细检查父控制器是否正在调用这些方法,如果不是,请自行调用。

答案 1 :(得分:4)

是的,是真的

您可以先在

中编写此代码来执行此操作
- (void)viewDidLoad {
    self.navigationController.delegate = self;  
}

然后在viewWillAppear

中编写要编写的代码
- (void)navigationController:(UINavigationController  *)navigationController didShowViewController:(UIViewController  *)viewController animated:(BOOL)animated {

    if ([viewController isKindOfClass:[self class]]) {
        //write your code here
    } 
}

答案 2 :(得分:2)

虽然你解决了你的问题,但如果将来有人出现,另一个问题可能是你忘记了任何一种方法的动画:参数 - 也就是说,方法的格式需要如下所示: p>

- (void) viewWillAppear:(BOOL)animated

答案 3 :(得分:0)

我在iOS7中注意到了同样的问题。当我使用标签栏(2个按钮A,B)和导航控制器时。

A有两个观点。一个有tableview,第二个根据表视图中的选择显示数据。

B是唯一的观点。

指向另一个单独视图D的按钮,放置在标签栏视图(A& B)和A的两个视图中。

当我单击标签项B,viewWillAppearviewDidLoad未调用的按钮时出现问题。

所以我通过presentModalViewController:animated:解决了这个问题,并且当我从标签项B中查看D时,我使用了dismissModalViewControllerAnimated: