2015-04-02 54 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單元格存在,您可以將其文本字段設置爲第一響應者。