2012-05-26 32 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单元类中调用。

相关问题