我的应用中有UITableViewController
,直接添加到视图层次结构中。视图出现后,我想滚动到一个特定的单元格。我的解决方案是调用代码滚动-[viewDidAppear]
。
根据Apple的文档,我必须手动调用该方法:
如果属于视图控制器的视图直接添加到视图层次结构中,则视图控制器将不会收到此消息。如果您向视图层次结构插入或添加视图,并且它具有视图控制器,则应直接向关联的视图控制器发送此消息。
问题是:什么时候是手动调用它的时候?
当我尝试进行滚动时,从父视图控制器的-[viewDidAppear]
调用它会导致崩溃,因为显然,表视图实际上还没有出现,因此认为它具有没有要滚动的部分。
答案 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)
答案 3 :(得分:0)
这是我手动拨打viewWillAppear
,viewDidAppear
,viewWillDisappear
,viewDidDisappear
的方式:here
和我以这种方式加载的其中一个视图控制器具有以下viewWillAppear:
(请注意,这是viewWillAppear
,因为在调用viewDidAppear
时,您的视图可通过以下方式查看:用户)
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[wordListTable reloadData];
[wordListTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}