如何在 UITableViewCell 中有一个可编辑的多 UITextView
Posted
技术标签:
【中文标题】如何在 UITableViewCell 中有一个可编辑的多 UITextView【英文标题】:How to have an editable multine UITextView in UITableViewCell 【发布时间】:2012-05-26 00:51:20 【问题描述】:我在 UITableViewCell 子类中有一个 UITextView。获得文本视图和单元格的新高度没有问题。我遇到的问题是告诉 UITableView 更新。
我已实现 heightForRowAtIndexPath:
以在 TextView 展开时返回单元格的实时高度。
但是在某个地方 `[tableView beginUpdates]; [tableView endUpdates];必须调用。
怎么样?我应该向设置为 UITableViewController 子类的 UITableViewCell 添加委托属性吗?然后当单元格扩展高度并且Tableview需要更新时发送委托消息?在 UITableViewCell 和 Controller 之间有一个委托似乎有点奇怪?
我尝试使用 NSNotificationCenter,但我有不止一个可编辑单元格,而且不止一个这种性质的表格视图。所以没有办法只注册单元格的通知而不复制和粘贴同一行,这不好(因为单元格是在 IB 中创建的,而不是在数组或集合中),并且有多个tableviews 意味着另一个 table view 发生异常,因为它被告知要更新但没有任何变化。
我已经看到很多关于这个主题的问题和答案,但是当谈到更新 tableview 时,他们都只是说“现在更新 tableview”而不是如何。那么我如何告诉他 tableview 从其中一个单元格更新?
【问题讨论】:
【参考方案1】:我认为这种行为最好在 UITableViewController
而不是视图本身(UITableViewCell
)中实现。
您的控制器负责设置单元格高度,通常是您的UITextView
的代表,所以让它处理所有这些。
在您的 textViewDidChange
方法中,确定单元格的新高度应该是多少,更新您的数据结构以反映这一点,然后调用 reloadRowsAtIndexPaths:withRowAnimation:
使其实际更改。
编辑:
因此,既然您不喜欢我的第一个建议,那么另一种方法是将recommendedRowHeight
属性添加到您的自定义UITableViewCell
。
然后,您可以从 UITableViewController
观察此属性,也可以使用以下方法实现委托协议:
- (void)recommendedRowHeightDidChange
// or
- (void)recommendedRowHeightDidChangeTo:(CGFloat)newHeight
然后,当您的身高发生变化时,更新您的 recommendedRowHeight
属性并在您走这条路线时调用您的委托方法。
无论哪种方式,一旦您的控制器发现推荐的单元格行高发生了变化,它就可以做它应该做的事情。更新反映当前行高的数据结构,然后调用reloadRowsAtIndexPaths:withRowAnimation:
。
【讨论】:
但这意味着如果我想在不同的表格视图中重用单元格,我必须复制和粘贴代码,而不是仅仅在单元子类中的一个地方 您可以使用相同的思路,而不是对视图进行子类化,而是对控制器进行子类化,以便将其保存在一个地方......【参考方案2】:您可以将 tableview 控制器对象添加为对 tableview 单元类的弱引用。在 tableview 控制器中,您可以拥有一个从 tableview 单元类调用的方法。
【讨论】:
以上是关于如何在 UITableViewCell 中有一个可编辑的多 UITextView的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UItableViewCell 内制作可滚动的 UITextField?
如何在 swift 中使自定义 UITableViewCell 中的链接可点击
如何动态计算自定义展开/可折叠 UITableViewCell 的高度
iOS 开发:如何在点击 UITableViewCell 时将其更改为可编辑的 UITextField?