在UITableViewController中没有调用viewWillAppear?

时间:2010-03-10 15:21:11

标签: iphone uiviewcontroller uitableview

我有几个UITableViewController类,我只是注意到这些方法没有被调用:

-(void)viewWillAppear:(BOOL)animated;
-(void)viewDidAppear:(BOOL)animated;

我在http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0中读到,在推送视图控制器时我必须自己调用这些方法,但这很奇怪,因为它适用于除UITableViewController之外的任何东西。

当我需要在推动UITableViewController的UIViewController中取消选择UITableViewCell时,这也是一个问题。

7 个答案:

答案 0 :(得分:9)

我在文档中找不到它,但我认为这可能是因为您使用的是UINavigationController。

如何设置UINavigationController的委托属性然后实现UINavigationControllerDelegate?它提供了两种可选方法:

– navigationController:willShowViewController:animated: 
– navigationController:didShowViewController:animated: 

例如,navigationController:willShowViewController:animated:可能看起来像这样:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  if ([viewController isKindOfClass:[UITableViewController class]]) {
    [viewController viewWillAppear:animated];
  }
}

无论如何,这将为您提供所需的行为,而无需破解对viewWillAppear的调用:整个项目。

答案 1 :(得分:5)

有没有人解决这个问题,因为原帖是正确的 - 只需使用UITableViewController并将该控制器的表视图推送到navController就不会触发这些方法,尽管它应该这样做。我有一系列UITableViewControllers和表视图,它们被推送和弹出以显示分层数据 - 没什么特别的,但是从不调用“viewWill / Did / Appear / Disappear”方法。只调用viewDidLoad和viewDidUnload。

在我们的设置中一定存在接线问题,但只需将视图推入navigationController应该是所有必需的(?) - 很难相信这可能已经被忽视了这么长时间的基本错误。

答案 2 :(得分:0)

默认情况下会调用这两种方法来通知更改。 UITableViewController是UIViewController的子类,因此会有相同的行为。您可以在View Controller Programming Guide

中查看更多内容

viewWillAppear:和viewDidAppear:方法为子类提供了执行与视图外观相关的任何其他操作的机会。

你怎么知道这些方法没有被调用?你能提供更多的代码吗,或者至少用NSLog()来测试它们,看看是否有一些消息被打印出来。

答案 3 :(得分:0)

我遇到了同样的问题。我有一个来自IB的简单UIView,我用一个扩展UITableViewController的类做一个addSubview。

我可以在我的应用程序中看到TableViewController的视图没有问题,但在这种情况下从不调用viewWillAppear函数。

答案 4 :(得分:0)

嗯,从问题中链接的讨论中有正确的答案。 UINavigationController需要接收“viewWillAppear”消息,以便将这些消息发送到您推送到它的视图控制器。

具有讽刺意味的是,如果你没有按照Apple推荐的那样做,并且你为视图控制器创建了UINavController的子类,那么一切都很有效。

但是,如果你只是在视图控制器中创建一个UINavController,那么你需要实现“viewWillAppear”,“viewDidAppear”等等,然后将它们转发给你的导航控制器。

请注意,如果您使用的是Three20,这一点尤为重要,因为它的视图控制器层次结构需要接收“viewWillAppear”消息。如果不是你最终会得到不能画的TTTableView。

答案 5 :(得分:0)

如果使用UITabViewController,也会出现同样的情况。您需要通过实现UITabViewControllerDelegate或UINavigationControllerDelegate回调来强制执行viewWillAppear调用

答案 6 :(得分:0)

此解释可能有所帮助:http://www.mlsite.net/blog/?p=210