我有一个messagesTableView,它显示在NavigationController的ViewController中。
在viewDidLoad中:
[self.messagesTableView reloadData];
NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
NSLog(@"ViewDidLoad: number of rows:%d Messages Count:%d", t, [messages count]);
NSIndexPath* ip = [NSIndexPath indexPathForRow: (t-1) inSection:0];
[self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionNone animated:NO];
}
并在viewDidAppear中:
[self.messagesTableView reloadData];
NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
NSLog(@"ViewDidAppear: number of rows:%d Messages Count:%d", t, [messages count]);
NSIndexPath* ip = [NSIndexPath indexPathForRow: (t - 1) inSection:0];
[self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
viewDidLoad中的scrollToRowAtIndexPath滚动到倒数第二行而不是最后一行,而viewDidAppear中的相同函数滚动到最后一行。唯一的问题是调用viewDidAppear函数需要一段时间。
但是为什么它在viewDidLoad和viewDidAppear中表现不同(NSLog为两者打印相同的值)?
答案 0 :(得分:1)
在滑入动画完成后调用viewDidAppear。您可能希望尝试在viewWillAppear中设置表格视图位置,以便在视图可见时立即显示在正确的位置。
我认为viewDidLoad在loadView之后被调用,但是在表视图的layoutSubviews之前。在此阶段添加的坐标不考虑导航栏。然后当推送viewController时,由navigationController调用另一个setFrame,以使tableView控制器的视图适合它的区域。这会将表格视图向下移动约44个点,导致底部单元格消失。
所有这些调整都在viewWillAppear中结束,所以这是最好的地方。
答案 1 :(得分:0)
只需输入您的scrollToBottom
代码:
[self.messagesTableView reloadData];
NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
NSLog(@"ViewDidLoad: number of rows:%d Messages Count:%d", t, [messages count]);
NSIndexPath* ip = [NSIndexPath indexPathForRow: (t-1) inSection:0];
[self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionNone animated:NO];
}
进入 -(void)viewWillLayoutSubviews
方法;
请注意确保animated:NO
;