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

发布于 2024-11-16 08:13:57 字数 1302 浏览 3 评论 0原文

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

如您所见,最后一行部分显示

在 vi​​ewDidAppear 中:

[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 为两者打印相同的值)?

I have a messagesTableView which is shown in a ViewController in a NavigationController.

In 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

and in 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

The scrollToRowAtIndexPath in viewDidLoad scrolls to second last row instead of the last row whereas the same function in viewDidAppear scrolls to the last row.. The only problem is that it takes a while for the viewDidAppear function to be called..

but why does it behave differently in viewDidLoad and viewDidAppear (the NSLog is printing the same values for both)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木槿暧夏七纪年 2024-11-23 08:13:57

viewDidAppear 在滑入动画完成后调用。您可能想尝试在 viewWillAppear 中设置表视图位置,以便表视图在可见时立即显示在正确的位置。

我认为 viewDidLoad 在 loadView 之后、表视图的 layoutSubviews 之前被调用。在此阶段,表格视图添加了坐标,不考虑导航栏。然后,当 viewController 被推送时,navigationController 会调用另一个 setFrame 来将 tableView 控制器的视图放入其区域。这会将表格视图向下移动大约 44 点,导致底部单元格消失。

所有这些大小调整都在 viewWillAppear 中完成,因此这是执行此操作的最佳位置。

viewDidAppear is called after ther slide-in animation is complete. You might want to try to set the table view position in viewWillAppear instead, so that the tableview shows at the correct position immediately when it becomes visible.

I think that viewDidLoad gets called after loadView, but before layoutSubviews of the table view. The tableview is added with coordinates not considering the navigation bar at this stage. Then when the viewController is pushed there is another setFrame called by the navigationController to fit the tableView controller's view into it's area. This moves the table view down by approx 44 points, causing the bottom cell to disappear.

All this resizing is over in viewWillAppear, so that's the best place to do that.

゛清羽墨安 2024-11-23 08:13:57

只需将您的 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;

Just place your scrollToBottom code:

[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];
} 

into -(void)viewWillLayoutSubviews method;

And note that make sure animated:NO;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文