【问题标题】: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 但是我到了删除按钮。有没有更细致的方法来检测这一点?

提前致谢!

【问题讨论】:

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

标签: ios objective-c uitableview


【解决方案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】:
  1. 子类 UITableViewCell 并将此属性添加到其 h。文件:

@property (nonatomic) UITableViewCellStateMask cellEditingState;

  1. 在您的自定义单元格中,在其 m 上。文件,添加以下覆盖:
-(void)willTransitionToState:(UITableViewCellStateMask)state
{
    [super willTransitionToState:state];
    self.cellEditingState = state;
}
  1. 现在,在您的 UITableView 的委托中,当您覆盖时

-(void)tableView:commitEditingStyle:forRowAtIndexPath:

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

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

【讨论】:

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

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

  1. 按左侧的删除按钮。
  2. 按右侧的删除按钮。

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

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

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

【讨论】:

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

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

@property (nonatomic, assign) BOOL isTableViewEditing;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多