2012-05-26 34 views
1

我在UITableViewCell子類中有一個UITextView。我沒有問題獲得文本視圖和單元格的新高度。我的問題是告訴UITableView更新。如何在UITableViewCell中具有可編輯的多線UITextView

我已經實現了heightForRowAtIndexPath:以返回TextView展開的單元格的高度。

但是某處`[tableView beginUpdates]; [tableView endUpdates];必須被調用。

怎麼樣?我應該添加一個委託屬性到設置爲UITableViewController子類的UITableViewCell嗎?然後在單元展開高度並且Tableview需要更新時發送委託消息?在UITableViewCell和Controller之間有一個委託似乎有點奇怪?

我試過使用NSNotificationCenter,但我有不止一個可編輯的單元格,並且比這種性質的tableview更多。所以沒有辦法只註冊單元格的通知而沒有複製和粘貼同一行再次,這不好(因爲單元格是在IB中創建的,並且不在數組或集合中),並且有多個tableviews意味着在其他表視圖上發生異常,因爲它被告知更新但沒有任何更改。

我已經看到很多關於這個主題的問題和答案,但是當涉及到更新tableview時,他們都只是說「現在更新tableview」,而不是如何去做。那麼我怎麼電視他tableview更新,從它的一個單元?

回答

1

我認爲這種行爲最好在UITableViewController而不是視圖本身(UITableViewCell)中實現。

您的控制器負責設置單元高度,並且通常是您的UITextView的代表,因此讓它處理所有這些。

在你的textViewDidChange方法中,計算出你的單元格的新高度應該是多少,更新你的數據結構以反映這一點,然後調用reloadRowsAtIndexPaths:withRowAnimation:使它實際上發生變化。

編輯:
所以,既然你不喜歡我的第一個建議,另一種方式來做到這將是一個recommendedRowHeight屬性添加到您的自定義UITableViewCell

然後,您可以從您的UITableViewController觀察此屬性或執行一個委託協議與線沿線的一個方法:

- (void)recommendedRowHeightDidChange 
// or 
- (void)recommendedRowHeightDidChangeTo:(CGFloat)newHeight 

然後,當你的身高變化,更新您的recommendedRowHeight屬性並調用您的委託的方法,如果你去那條路線。無論哪種方式,一旦您的控制器發現推薦的單元格行高發生了變化,它就可以做它應該做的事情。更新反映當前行高的數據結構,然後致電reloadRowsAtIndexPaths:withRowAnimation:

+0

但是這意味着如果我想在不同的表視圖中重用te單元格,我必須複製並粘貼代碼,而不是將它放在Cell子類的一個地方 –

+0

您可以使用相同的思路而不是子類化視圖,控制器的子類,以保持在一個地方.... – lnafziger

0

您可以添加您的tableview控制器對象作爲您的tableview單元類的弱引用。在tableview控制器中,你可以有一個方法,它將從tableview單元類中調用。

相關問題