滑动删除单元格不会取消 UIButton 操作

Posted

技术标签:

【中文标题】滑动删除单元格不会取消 UIButton 操作【英文标题】:Swipe to delete cell does not cancel UIButton action 【发布时间】:2014-05-16 19:22:34 【问题描述】:

我的UITableView 启用了滑动删除功能。每个单元格上都有一个UIButton,它执行一个动作(在本例中,执行一个segue)。

我希望如果我通过触摸按钮滑动单元格,按钮的操作将被取消/忽略,并且只会处理滑动。然而,实际发生的是两种手势(滑动 + 点击)都被检测和处理。

这意味着如果我只想删除一个单元格并通过触摸按钮“意外”滑动,应用程序将转到下一个屏幕。

在这种情况下,如何强制我的应用忽略点击?

【问题讨论】:

【参考方案1】:

august 的回答对我来说已经足够好了,但我想出了如何让它变得更好:

检查表格是否处于编辑模式以确定按钮是否应该执行其操作将使其行为正常,但用户体验仍然存在问题:

如果用户想要退出编辑模式,他应该能够点击单元格中的任意位置来实现,包括按钮。不过UIButton的动作还是会先被app解析,点击按钮不会退出编辑模式。

我找到的解决方案是在进入编辑模式时禁用按钮的用户交互,并在完成后重新启用它:

// View with tag = 1 is the UIButton in question
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
  [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:NO];


- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath 
  [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:YES];

这样,拖动按钮进入编辑模式不会触发按钮的动作,点击退出编辑模式确实会退出编辑模式。

【讨论】:

【参考方案2】:

只要单元格进入编辑模式,一种优雅的方法就是忽略按钮点击。这是有效的,因为滑动删除手势将导致 willBeginEditingRowAtIndexPath 在按钮点击操作被调用之前被调用。

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

    self.isEditing = YES;


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

    self.isEditing = NO;


// button tapped
- (IBAction)tap:(id)sender

    if (self.isEditing) 
        NSLog(@"Ignore it");
    
    else 
        NSLog(@"Tap");
        // perform segue
    

【讨论】:

好主意!另外,UITableView 已经有一个属性标志 editing(getter isEditing),所以不需要创建一个。 帮助很大!【参考方案3】:

也可以在您的单元格的子类中执行此操作:

override func setEditing(editing: Bool, animated: Bool) 
    super.setEditing(editing, animated: animated)

    actionButton?.userInteractionEnabled = !editing

【讨论】:

【参考方案4】:

因为从按钮按下调用我的函数是我的主要UITableViewController 类的委托并作为 IBAction 连接到UITableViewCell,所以我的UITableViewCell 中的按钮仍然在滑动时触发UIButton 作为滑动的一部分按下。

为了阻止这种情况,我使用了与接受的答案相同的 UITableView 代表,但必须设置一个文件级变量来监视是否正在发生编辑。

// in custom UITableViewCell class
@IBAction func displayOptions(_ sender: Any) 
    delegate?.buttonPress()


// in UITableViewController class that implemented delegate
fileprivate var cellSwiped: Bool = false

func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) 
    cellSwiped = true


func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) 
    cellSwiped = false


func displayContactsSheet(for contact: Contact) 
    if cellSwiped 
        return
    
    // proceed with delegate call button press actions

【讨论】:

以上是关于滑动删除单元格不会取消 UIButton 操作的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中取消 UITableViewCell 滑动删除时收到通知

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

UI测试滑动删除表格视图单元格

iOS - 如何查看表格视图单元格上的“滑动删除”操作?

使用向后滑动手势以交互方式取消选择选定单元格

UITableView 禁用滑动以快速删除特定单元格