检测到滑动删除按钮和在编辑模式下制作的删除按钮之间的区别?

Posted

技术标签:

【中文标题】检测到滑动删除按钮和在编辑模式下制作的删除按钮之间的区别?【英文标题】:Detect the difference between a swipe-to-delete button and a delete button made in Edit mode? 【发布时间】:2013-11-18 11:38:50 【问题描述】:

我目前设置了一个 UITableView 以启用滑动删除(滑动显示删除按钮)。我还有一个“编辑”按钮,当按下该按钮时,每个单元格的红色删除圆圈中都会滑动。点击其中一个圆圈会导致“删除”按钮显示为好像我滑动了单元格一样。

我想检测删除按钮是通过红色圆圈之一(即在编辑模式下)还是通过直接在单元格上滑动创建的(原因是我希望用户确认他们是否没有通过编辑模式进入,因为如果他们错误地输入数据,可能会丢失大量数据)。

我已经尝试了 tableView 的 isEditing 属性,但那是 YES 但是我到了删除按钮。有没有更细致的方法来检测这一点?

提前致谢!

【问题讨论】:

我会在这两种情况下确认;在编辑模式下,也有可能出错(选择一个额外的项目进行删除)。 这不是批量删除模式,所以在编辑更多时,您已经需要点击红色圆圈,然后点击删除按钮。这似乎足够安全,但对于只是滑动+点击的选项,我想确认一下。 【参考方案1】:

更简单的方法是使用UITableView 委托支持来了解您何时将进入单行编辑。 tableView:willBeginEditingRowAtIndexPath: 委托调用发生在调用 setEditing:animated: 之前,这允许您避免任何正常的编辑设置,例如创建插入行等。tableView:willEndEditingRowAtIndexPath: 在 setEditing:animated 之后调用。

所以代码很简单:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

    self.singleRowDeleteMode = YES;


- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath

    self.singleRowDeleteMode = NO;


- (void)setEditing:(BOOL)editing animated:(BOOL)animated

    [super setEditing:editing animated:animated];
    if (self.singleRowDeleteMode)  return; 
    // Continue setup of normal edit mode

【讨论】:

这个答案节省了我很多时间!谢谢!【参考方案2】:
    子类 UITableViewCell 并将此属性添加到其 h。文件:

@property (nonatomic) UITableViewCellStateMask cellEditingState;

    在您的自定义单元格中,在其 m 上。文件,添加以下覆盖:
-(void)willTransitionToState:(UITableViewCellStateMask)state

    [super willTransitionToState:state];
    self.cellEditingState = state;

    现在,在您的 UITableView 的委托中,当您覆盖时

-(void)tableView:commitEditingStyle:forRowAtIndexPath:

您可以通过向左滑动来识别删除按钮在显示后被点击的场景,方法是:

    YourCustomCellClass *cell = (YourCustomCellClass *)[tableView cellForRowAtIndexPath:indexPath];
    BOOL shouldReturnToNoneEditingMode = (cell.cellEditingState == UITableViewCellStateShowingDeleteConfirmationMask);

【讨论】:

不错的解决方案。为我工作。【参考方案3】:

Apple 专门设计了需要 2 个手势的删除模式。在编辑模式下,您必须:

    按左侧的删除按钮。 按右侧的删除按钮。

在非编辑模式下,您必须:

    滑动单元格。 按右侧的删除按钮。

添加第三个验证步骤是多余的,会导致糟糕的用户体验。

【讨论】:

我同意,但我不是 UX 设计师,所以我必须让这些东西发挥作用;) 告诉你的用户体验设计师辞掉他们的日常工作。我添加了另一个可以帮助您的答案。【参考方案4】:

您需要做的第一件事是添加一个属性:

@property (nonatomic, assign) BOOL isTableViewEditing;

当按下编辑按钮并进入编辑模式时,请设置此属性以匹配该值。当您收到对tableView:commitEditingStyle:forRowAtIndexPath: 的调用时,您可以使用此属性来查看它是通过滑动调用还是处于编辑模式。

【讨论】:

以上是关于检测到滑动删除按钮和在编辑模式下制作的删除按钮之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

当用户没有完全滑动以删除表格视图单元格时,如何禁用/启用编辑按钮?

允许 UITableView 重新排序,但在编辑模式下不删除,并启用滑动删除

UITableView 区分滑动删除和多行选择

如何检测 UITableCell 上的右滑动并显示自定义按钮而不是删除按钮

Swift:如何使用编辑按钮删除并停用滑动删除?

在 UITableView 编辑模式下更改删除按钮标题 [重复]