iOS SDK:如何获取表视图中不可见的单元格?

10

如何获取当前不可见的表格中的某个indexPath对应的单元格?(即超出范围的单元格)

获取单元格的代码:

NSString *name = [[(ELCTextfieldCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] rightTextField] text];

-cellForRowAtIndexPath... 返回 nil 是因为所需的 indexPath 对应的单元格超出了范围。那么我如何获取正确的单元格而不是 nil 呢?


请提供更多的信息和代码。 - dasdom
好的,我有一个分组表视图,在其中一些单元格中有文本字段,并且在末尾有代表按钮的单元格。 现在我的问题是,如果我在表视图的末尾,我的前几个单元格现在已经超出范围,但是如果我点击代表按钮的单元格,我需要在开头提供的信息。 现在我尝试了:[[(ELCTextfieldCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] rightTextField] text] 但是 -cellForRowAtIndexPath:... 返回nil,因为该单元格超出范围。 那么,我如何获取正确的单元格(而不是nil)? - Daniel Mühlbachler-P.
你问题的答案就像nacho4d所说 - 不要使用单元格来获取信息,而是从底层数据源获取。更广泛的答案是,你似乎正在使用表视图来布置滚动界面,而不是在滚动视图中使用视图。 - Abizern
5个回答

17

UITableView 仅保留可见的单元格。如果您需要不可见的单元格,则必须调用 UITableViewdataSourcetableView:cellForRowAtIndexPath: 方法。因此,如果 self 是一个作为 dataSource 的类:

UITableViewCell * cell = [self tableView:table cellForRowAtIndexPath:indexPath];

3
通常情况下,这不会保留在这些单元格中输入的数据。只有在仍然在缓存中时才有效。 - Eiko

5

这不是它的工作方式。你需要在信息被输入或更改后立即抓取并存储信息。它可能很容易超出范围,你不能保证你的单元格足够长久。嗯,从技术上讲,你可以持有它(并始终为相同的索引路径返回完全相同的单元格),但我会质疑这种设计。


好的,但是我有一个表格,其中单元格可以动态添加,而且我不知道用户会产生多少个单元格。 - Daniel Mühlbachler-P.
我认为唯一合理的方法是在更改发生时立即保存更改。您可能会在以后难以检索该数据,甚至该单元格可能已经“死亡”并被释放。 - Eiko

2
UITableViewCells被设计成可以重复使用/回收,这样用户就不需要创建比可见单元格数量更多的单元格。通常情况下,您不需要访问不可见的单元格。只需访问数据源并在那里获取/设置相应的数据即可。单元格用于显示数据源的某些状态,而不是数据源本身。
编辑:您说您需要从上面的一个单元格中获取一些信息(文本),对吗?如果您使用“cellForRowAtIndexPath:”方法,则会重新创建单元格,但您可能无法获取文本字段中的文本。原因是什么?因为您可能没有将其保存在其他地方。如果您已经保存了它,请直接访问它,而不是通过单元格。

1
继@Raphael的回答之后,这是(可用的)swift 3解决方案:

UITableViewCell cell = self.tableView(self.tableView, cellForRowAt: indexPath)


0

你填充表格的信息来自于数组吗?你不能直接从数组中提取0索引处的数据吗?就像你的cellForRowAtIndexPath在显示单元格时预计会检索和填充该单元格一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接