UITableView不滚动到底部

问题描述:

嗨我要给你链接一个视频展示我的问题,因为它有点难以用文字表达。 UITableView not scrolling to bottom 在视频中,我点击一个按钮,将项目添加到列表中。请注意,我并未停留在第16项,并且我仍然向清单中添加了更多未显示的项目。最后,在增加了新的项目,该列表会自动通过UITableView不滚动到底部

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

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

+0

我有一个IBAction的“添加”按钮。这是我在视频中向项目表中添加项目的人。 – user2402616

+1

这可能是UITableView的contentSize属性不正确的问题。我认为最近我遇到了同样的问题,在添加新单元格时,将一些调试代码放入以查看您的内容大小是否正在更新 –

+0

内容大小的高度每次都会更新44(默认行高)。显然宽度保持不变。高度从109开始,这是桌子开始的地方。现在只有当高度超过1024(iPad mini的高度)时才会自动向下滚动。然而,从身高813-1033没有新的项目出现。任何想法? – user2402616

从我所看到和评论,我认为这可能是您UITableView的高度比设备的屏幕尺寸更大,这意味着它不会好向下滚动,因为这些项目尚未达到UITableViewUIScrollView的底部。

转到IB并设置约束,以便UITableView等于视图控制器的宽度和高度。

+0

我做到了,但是它重叠了顶部的所有元素。 IE浏览器。视频中的按钮。此外,“查看”模式是在“规模填补”属性下 – user2402616

+1

哦对不起忘了按钮。删除约束并设置新的顶部和底部空间到容器和宽度(或开头和尾部空间) –

+0

确定它现在有效,但有一个大错误。我不确定我做了什么,但我无法撤销在大声笑前的情况。第一个视频将向您展示如何将UITableView的约束与视图控制器相关联。第二部影片会告诉你发生了什么事。 (http://www.youtube.com/watch?v=nt-h88hBdT8&feature=youtu.be)http://www.youtube.com/watch?v=r1zSNud1Xcs&feature=youtu.be – user2402616

最有可能的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]; 
}); 

而且,你不应该在这种情况下使用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]; 
}); 
+0

我使用“NSTableViewAnimationEffectNone”的未声明标识符。而且,引入的延迟没有效果。 – user2402616

+1

对不起,对于动画,可能是'UI'而不是'NS',请检查表格视图文档。你应该使用它来代替reloadData。 –

+1

不确定你的问题是如果引入延迟没有解决它,也许@Nic Robertson是正确的,在这种情况下,它听起来像苹果需要解决的错误...并且你需要找到一种解决方法,直到那时。 –

似乎你们大多数人都是错的。

它应该是这样的:

[self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

也就是说,应该是UITableViewScrollPositionTop,不UITableViewScrollPositionBottom。 atScrollPosition:UITableViewScrollPositionTop是更改的起源,而不是目的地。