2011-03-17 41 views
12

我有一個UITableViewCell內的TextView。 TextView中的文本可以在那裏編輯。更改UITableView行高而不關閉鍵盤

TextView垂直增長和縮小,取決於文本包含的行數。到目前爲止,我還沒有發現讓包含TextView的行動態增長和縮小的可能性。

[tableView reloadData]; 

[tableView reloadRowsAtIndexPaths: withRowAnimation:]; 

不工作,因爲他們解僱每次改變鍵盤。

有沒有辦法改變UITableView中的單個行的高度而不關閉鍵盤?

回答

30

是的,您可以在輸入時調整行高。它不記錄,並且這違背原因,但所有你需要做的是設置在tableView.rowHeight新值(或有heightForRowAtIndexPath:準備計算新的高度),那麼這樣做:

[tableView beginUpdates]; // updates the row heights ... 
[tableView endUpdates]; // ... nothing needed in between 
+0

是的!真棒!但有一點需要注意:它只有在將TextView內的每個編輯事件的當前文本保存到填充單元格負載的TextView的變量時才起作用。 beginUpdates/endUpdates似乎不能訪問完全相同的TextView對象和我正在​​編輯的文本。 – Stefan 2011-04-15 08:03:40

+0

雖然,似乎只適用於iOS> = 4.0,但鍵盤沒有彈起。 – Stefan 2011-05-09 10:17:41

+0

YAY!謝謝。我花了一段時間才找到正確的Google關鍵字,但是您爲我省去了很多麻煩。 – 2012-03-10 21:22:18

0

reloadRowsAtIndexPaths單元格更改內存值後,如果在reloadRowsAtIndexPaths之後調用becomeFirstResponder,則試圖將舊單元格設置爲firstResponder,該單元格不存在(becomeFirstResponder返回false和鍵盤出口)。

解決方法是再次調用cellForRowAtIndexPath以獲取重新加載的單元格的新內存值,然後調用becomeFirstResponder到該單元格。

+0

好,謝謝之後調用moveRowAtIndexPath:toIndexPath:爲同一indexPath。不幸的是,這仍然不能解決原始問題,因爲它會使鍵盤反彈。成爲FirstFoundResponder的呼叫,儘管它按照你的方式工作,但已經太遲了,鍵盤已經開始消失(由於我假設有reloadRowsAtIndexPath)。 – Stefan 2011-04-01 07:52:28

0

任務是調用行高重新計算而不用單元重用(以節省當前響應者)。

一個可以高度變化

- (void)textInputTableView:(UITableView *)tableView cellHeightDidChangeForIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath]; 
}