UITableView scrollToRowAtIndexPath
Posted
技术标签:
【中文标题】UITableView scrollToRowAtIndexPath【英文标题】: 【发布时间】:2009-09-26 00:35:40 【问题描述】:我试图让我的表格视图记住它的最后一个位置,以便在应用再次运行后,它会滚动到那个位置。为此,在我的viewWillDisappear:
方法中,我获取第一个可见行号并将其保存到NSUserDefaults
。然后在我的 viewDidAppear 中,我尝试通过将scrollToRowAtIndexPath
发送到表格视图来滚动到该行。但是我得到了NSRangeException
:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[:atScrollPosition:animated:]: section (0) beyond bounds (0).
任何帮助表示赞赏。代码如下:
- (void)viewDidAppear:(BOOL)animated
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([userDefaults valueForKey:@"content_row"] != nil)
int rowToHighlight = [[userDefaults valueForKey:@"content_row"] intValue];
NSIndexPath * ndxPath= [NSIndexPath indexPathForRow:rowToHighlight inSection:0];
[contentTableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
-(void) viewWillDisappear:(BOOL)animated
NSIndexPath *selectedRowPath = [[contentTableView indexPathsForVisibleRows] objectAtIndex:0];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:selectedRowPath.row forKey:@"content_row"];
【问题讨论】:
您能发布一些创建 scrollToRowAtIndexPath 和 NSIndexPath 的代码吗? 【参考方案1】:在调用 scrollToRowAtIndexPath 之前重新加载 TableView 数据。
[contentTableView reloadData];
【讨论】:
当数据尚未加载(使用获取的结果控制器)时,这对我不起作用。我的解决方案是先检查tableView.numberOfRowsInSection(0) > 0
。
或者如果在不同的线程上,试试这个。 [tblView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]
【参考方案2】:
可能是contentTableView还没有加载完数据。
【讨论】:
完成后如何收到通知? 抱歉,我以为在 viewDidLoad 中调用了 scrollToRowAtIndexPath。我在 viewDidAppear 中有类似的调用,但我没有返回保存的行号,而是返回保存在 didSelectRowAtIndexPath 中的保存键值。在调用 scrollToRowAtIndexPath 之前,我在当前加载的数据源中找到了该键值所在的行。 甜蜜!这实际上帮助我的齿轮朝着正确的方向旋转。我在单独的答案中进行了详细说明。【参考方案3】:我想详细说明 DyingCactus 的回答。我是一个相当新的 ios 开发人员,我的情况有点不同,但正如他所说
"可能是contentTableView还没有加载完毕 数据”
虽然答案很简短,但它让我的车轮转动起来,这正是发生在我身上的事情。
我的设置
UITableView 位于 ViewController“A”上 我的应用提供了一个新的 ViewController“B” 在 ViewController "B" 上单击一个按钮,然后将数据添加到 UITableView 的数据源中。 从 B 的按钮点击处理程序中,[tableView reloadData]
被调用
从 B 的按钮单击处理程序中,[tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop];
被调用
ViewController“B”被解除,“A”再次出现(显示更新的 UITableView)
解决方案
我必须解决的第一个问题是像这样在主线程上调用reloadData
[tblView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:false];
最后一个问题是将waitUntilDone
更改为true(DUH!)
是的,很明显,对我来说,contentTableView 没有完成加载数据,因为我在主线程上运行的 reloadData 调用在选择器完成之前没有明确设置为阻塞。
希望这对某人有所帮助。
【讨论】:
以上是关于UITableView scrollToRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView
如何与重叠显示的 UITableView 交互另一个 UITableView