迭代通过UITableViewCells的奇怪行为

时间:2015-04-02 15:44:29

标签: ios objective-c uitableview

我有一个基于UITableView的用户输入表单,其中每个单元格包含一个输入控件,UITextField或UITextView。我已将“下一个”和“上一个”按钮添加到文本字段的附件视图中,以便用户可以在文本字段中前后导航。我有一个方法可以控制文本字段并使其成为第一个响应者。到目前为止,一切都运作正常。

在我设置第一个响应者的方法中,我正在调用一个帮助方法来获取下一个单元格,向前或向后移动:

- (UITableViewCell*)nextFormCell:(UITableViewCell*)lastCell isForward:(BOOL)forward
{
    NSIndexPath* path = [_formTableView indexPathForCell:lastCell];
    NSInteger rowIndex = forward ? (path.row + 1) : (path.row - 1);
    UITableViewCell* nextCell = [_formTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:rowIndex inSection:path.section]];
    return nextCell;
}

前进(下一步)完美无缺,此方法始终返回一个单元格。但是,向后(前一个),该方法有时返回nil。我已经验证rowIndex包含两个方向的正确值。这没有多大意义。如果我向前传递一个rowIndex并且我得到一个单元格,那么为什么它不会用相同的索引向后移动呢?

通过UITableView单元向后导航是否存在任何已知问题?谢谢!

1 个答案:

答案 0 :(得分:3)

您忘记了细胞被重复使用。除了屏幕上显示的那些以及可能还有一个或两个前进之外,在任何给定时刻都不存在细胞。 cellForRowAtIndexPath:不适用于每个索引路径,因为并非所有单元格都存在于任何一个时刻:只存在表格实际显示的单元格。这就是允许cellForRowAtIndexPath:返回nil

的原因

基本上,您需要重新考虑整个策略,以便导航"导航"桌子。相反,首先滚动到要导航到的单元格(scrollToRowAtIndexPath:atScrollPosition:animated:)。 现在单元格存在,您可以将其文本字段设置为第一响应者。