用户点击编辑按钮时重做 UITableView 布局?
Posted
技术标签:
【中文标题】用户点击编辑按钮时重做 UITableView 布局?【英文标题】:Redoing UITableView layout when user taps Edit button? 【发布时间】:2010-02-08 18:11:25 【问题描述】:我有一个内容复杂的 UITableView。当按标准方式点击编辑按钮时,用户可以编辑(重新排列和删除)单元格。但我希望单元格在“编辑”模式下看起来不同。
问题:
编辑模式下如何改变UITableView的布局,包括改变行高?
到目前为止,这就是我所拥有的:
Edit 按钮向每个 uitableviewcell (UITVC) 发送 WillTransitionToState/DidTransitionToState 消息。我对 UITVC 进行了子类化,并在每个单元格内对这些做出反应,根据需要隐藏、删除和重新洗牌。但是,改变行高超出了一个单元格的范围。
当用户点击编辑时,似乎没有向 UITableView 发送消息。有一个 - tableView:commitEditingStyle:forRowAtIndexPath: 在编辑特定行后发送到数据源。
在 heightForRowAtIndexPath 中,我可以使用 tableView.editing 属性查询当前模式,并根据需要报告高度。我可以通过调用 [tableView reloadData] 来触发重新流动表格,包括重新计算高度。但是,我什么时候调用它?
我可以将来自 WillTransitionToState 中的单元格的消息发送回“拥有”表视图,并在收到消息时调用 reloadData。但这听起来很脆弱,必须有更好的方法。
【问题讨论】:
【参考方案1】:节奏是对的。使用 reloadData 会破坏漂亮的编辑动画。
这篇文章解决了这个问题: Can you animate a height change on a UITableViewCell when selected?
在调用 setEditing:animated 之后,不要使用 reloadData,而是执行以下操作。
[tableview setEditing:editing animated:YES];
[tableview beginUpdates];
[tableview endUpdates];
【讨论】:
【参考方案2】:如果您希望表格单元格更改其格式以响应表格是否处于编辑模式,您可以在 UITableViewController 中覆盖 -setEditing:animated:
并触发重新加载(通过 -reloadData
)表格视图关于编辑状态的变化。
在你的 UITableViewController 的-tableView:cellForRowAtIndexPath:
方法中,你可以通过查询表格视图的editing
属性来检查表格是否处于编辑状态,然后根据表格的状态返回不同的单元格类型在里面。
【讨论】:
按预期工作。我自己一开始就感到困惑,因为正确的方法签名是 - (void)setEditing:(BOOL)editing animated:(BOOL)animate,但我使用的是 - (UITableView *)tableView setEditing:(BOOL)editing animated:(BOOL )动画,这当然不起作用。因此,请务必仔细检查文档中的方法签名。 :)以上是关于用户点击编辑按钮时重做 UITableView 布局?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止多次快速点击 UITableView 的编辑按钮导致应用程序崩溃?
在 UITableViewCell 中添加自定义编辑和删除按钮