UITableView没有滚动到底部

use*_*616 9 objective-c uitableview ios

嗨,我要给你链接一个展示我的问题的视频,因为它有点难以传达. UITableView没有滚动到底部 在视频中我点击了一个按钮,它将项目添加到列表中.请注意,我没有在第16项停止,并且我仍然在列表中添加了更多未显示的项目.最后,添加新项目后,列表将自动向上滚动

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]];

[self.tbl reloadData];

[self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
Run Code Online (Sandbox Code Playgroud)

主要问题是在视频结束时,我滚动到最后几个项目,但我无法选择它们.显然这个问题必须处理UITableView的高度.我试过在故事板编辑器中更改它,但它没有做任何事情.有任何想法吗?提前致谢!

Nic*_*son 22

从我所看到和评论好吧,我认为这是可能是你的高度UITableView比设备的屏幕尺寸,这意味着因为项目还没有到达底部也不会向下滚动较大UITableViewUIScrollView.

转到IB并设置约束,使其UITableView等于视图控制器的宽度和高度.


Abh*_*ert 6

reloadData调用它时很可能没有完全执行,因为它假设您可能会进行更多更改并告诉它再次重新加载.

尝试引入零秒延迟,让它有机会运行:

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]];

[self.tbl reloadData];

double delayInSeconds = 0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  [self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
});
Run Code Online (Sandbox Code Playgroud)

此外,您不应该reloadData在这种情况下使用.这是应该添加行的方式:

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]];

[self.postsTableView beginUpdates];
[self.postsTableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:_items.count - 1] withAnimation:NSTableViewAnimationEffectNone]; // maybe you want some other animation here
[self.postsTableView endUpdates];

double delayInSeconds = 0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  [self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
});
Run Code Online (Sandbox Code Playgroud)