用户点击编辑按钮时重做 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 中添加自定义编辑和删除按钮

以编程方式编辑 UITableView 在所有行上显示删除按钮

当用户点击加号按钮插入行时 UITableView 响应

快速点击按钮时添加行或文本字段

为啥我的 UITableView 的“点击编辑”功能很慢?