是否正确手动调用viewDidAppear?

时间:2009-09-22 17:53:18

标签: iphone scroll uitableview viewdidappear

我的应用中有UITableViewController,直接添加到视图层次结构中。视图出现后,我想滚动到一个特定的单元格。我的解决方案是调用代码滚动-[viewDidAppear]

根据Apple的文档,我必须手动调用该方法:

  

如果属于视图控制器的视图直接添加到视图层次结构中,则视图控制器将不会收到此消息。如果您向视图层次结构插入或添加视图,并且它具有视图控制器,则应直接向关联的视图控制器发送此消息。

问题是:什么时候是手动调用它的时候?

当我尝试进行滚动时,从父视图控制器的-[viewDidAppear]调用它会导致崩溃,因为显然,表视图实际上还没有出现,因此认为它具有没有要滚动的部分。

4 个答案:

答案 0 :(得分:10)

如果您使用的是视图控制器控件,请不要直接致电viewWillAppear:。而是使用– beginAppearanceTransition:animated:– endAppearanceTransition

  

如果要实现自定义容器控制器,请使用此方法告诉孩子其视图将要显示或消失。不要直接调用viewWillAppear:,viewWillDisappear:,viewDidAppear:或viewDidDisappear:

如果视图的viewController是子视图控制器,则调用addSubView将自动触发viewWillAppear:viewDidAppear:,因此直接调用viewWillAppear:将触发视图将两次外观方法。使用beginAppearanceTransition:animated:and - endAppearanceTransition`将禁止自动行为,因此您只能调用一次。

答案 1 :(得分:1)

通过父控制器的 -viewDidAppear 调用它通常是您最好的选择。

如果子视图控制器尚未完全初始化,如果这会导致问题,则可能还有其他问题。在调用 -viewWillAppear 之后,确保您的子视图控制器完全“准备好行动”(您也可以从父级的 -viewWillAppear 手动调用)

答案 2 :(得分:1)

在tableview上的[viewDidAppear]中,确实从父视图控制器调用 - [viewDidAppear],可以调用[tableView reloadData],这样就可以确保tableView被加载并准备就绪。

答案 3 :(得分:0)

这是我手动拨打viewWillAppearviewDidAppearviewWillDisappearviewDidDisappear的方式:here

和我以这种方式加载的其中一个视图控制器具有以下viewWillAppear:(请注意,这是viewWillAppear,因为在调用viewDidAppear时,您的视图可通过以下方式查看:用户)

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [wordListTable reloadData];
    [wordListTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}