2015-04-02 92 views
1

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

在我的方法是设置第一个响应者,我打电话是得到下一个单元一个辅助方法,无论是去向前或向后:

- (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单元向后导航?谢谢!

+3

最有可能是因为上面的行不在屏幕上,所以单元格不存在... – Wain 2015-04-02 15:48:34

+1

表格视图控制器可能释放不在视图中的单元格,这就是为什么下一个单元格工作正常因为在视图中显示),但以前没有。不确定,只是一个猜测。 – 2015-04-02 15:49:03

回答

3

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

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