scrollToRowAtIndexPath滚动到倒数第二行而不是最后一行

时间:2011-06-20 04:15:14

标签: iphone uitableview uinavigationcontroller scrollto viewdidload

我有一个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];
}

As you can see, the last row is partially shown

并在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];
}

The last is shown completely

viewDidLoad中的scrollToRowAtIndexPath滚动到倒数第二行而不是最后一行,而viewDidAppear中的相同函数滚动到最后一行。唯一的问题是调用viewDidAppear函数需要一段时间。

但是为什么它在viewDidLoad和viewDidAppear中表现不同(NSLog为两者打印相同的值)?

2 个答案:

答案 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;