在 UITableViewController 中没有调用 viewWillAppear?

Posted

技术标签:

【中文标题】在 UITableViewController 中没有调用 viewWillAppear?【英文标题】:viewWillAppear not called in UITableViewController? 【发布时间】:2010-03-10 15:21:11 【问题描述】:

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

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

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

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

【问题讨论】:

Sorry.. 为什么 UITableViewController 默认不调用这些方法? 【参考方案1】:

我在文档中找不到它,但我认为这可能是因为您使用的是 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: 的调用。

【讨论】:

【参考方案2】:

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

在我们的两个设置中肯定存在接线问题,但只需将视图推送到 navigationController 中就足够了 (?) - 很难相信这会作为一个基本错误这么长时间而被忽视。

?

【讨论】:

【参考方案3】:

默认调用这两个方法来通知更改。 UITableViewController 是 UIViewController 的子类,所以会有相同的行为。您可以在View Controller Programming Guide中查看更多信息

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

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

【讨论】:

能否多提供一些这两种方法的实现代码,让我看看会发生什么... 很难在评论区。基本上我有一个 UINavigationController,在导航栏中,我有一个 UISegmentedControl。切换段,用户在两个视图(配置文件和订单)之间切换。单击订单应将视图推送到具有订单详细信息的另一个视图(在同一 UINavigationController 内)。基本上,它与 App Store 应用程序的“精选”部分相同。您有 3 个段,每个段都有自己的 UITableView,可以推送新视图。我在尝试做到这一点时遇到了很多问题。 我还没有清楚地理解你的情况,但你可能想使用 UISegmentedControl 的这些方法来控制段的行为 – setEnabled:forSegmentAtIndex: – isEnabledForSegmentAtIndex:. 好吧,也许有一些输入:你将如何设置 UINavigationController,navigationBar 内部将是一个 UISegmentedController,它有 3 个段,每个段包含一个 UITableView 并保留推送的能力等?【参考方案4】:

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

我可以在我的应用程序中毫无问题地看到 TableViewController 的视图,但在这种情况下永远不会调用 viewWillAppear 函数。

【讨论】:

我了解到这些委托方法只为 UIViewController 类调用。【参考方案5】:

嗯,与问题相关的讨论中包含正确的答案。 UINavigationController 需要接收“viewWillAppear”消息才能将这些消息发送到您推送到它的视图控制器。

具有讽刺意味的是,如果您不按照 Apple 的建议进行操作,并且将 UINavController 子类化为视图控制器,那么一切正常。

但是,如果您只是在视图控制器中创建 UINavController,那么您需要实现“viewWillAppear”、“viewDidAppear”等并将它们转发到您的导航控制器。

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于在 UITableViewController 中没有调用 viewWillAppear?的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏中使用 UITableViewController

在 UINavigationController 中显示 UITableViewController

在 UIPopoverController 中显示 UItableViewController

在 UITableViewController 中没有调用 viewWillAppear?

如何在 UITableViewController 中显示 MSMutableArray 数据?

没有在 UITableViewController 中调用 DidSelectRowAt