如何向右滑动隐藏 UITableView 中的删除按钮?

Posted

技术标签:

【中文标题】如何向右滑动隐藏 UITableView 中的删除按钮?【英文标题】:How to swipe right to hide delete button in UITableView? 【发布时间】:2018-01-31 19:17:41 【问题描述】:

当前,当您在表格视图单元格上向左滑动时,我的 UITableView 会显示“删除”按钮。我想在同一个单元格上向右滑动来隐藏这个按钮。它也应该是粘性的,以便在我向右滑动时隐藏 - 就像它在您向左滑动时显示“删除”按钮一样。现在,当我向左滑动以显示删除按钮时,我只能在滚动表格视图时隐藏它。有没有一种内置的方法来实现这种向右滑动隐藏的行为?还是需要定制解决方案?

编辑:我认为默认的 Messages 应用程序有这种行为,但我意识到当我向右滑动时,我稍微滚动了 tableview 导致它隐藏。现在唯一的隐藏方法是点击单元格或滚动表格视图

我已经通过实现以下方法设置了我的 tableView 以显示删除按钮:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
   if editingStyle == .delete 
        print("deleted!")
        

【问题讨论】:

可以分享截图吗?输出如何? 【参考方案1】:

是的,我在尝试让用户滑动删除“删除”选项时也遇到了问题。 (类似于 Apple 邮件应用的工作方式)

我发现它按预期工作的唯一方法是,如果您还包括一个leadingSwipeAction...(如果用户最初向右或向左滑动,他们会得到不同的选项)。添加另一侧后,用户就可以将“删除”滑开。

顺便说一句,“Swipe the Delete Away”听起来像是一首令人兴奋的 emo 歌曲。

这是我目前拥有的几乎可以完美运行的代码。偶尔会出现图形异常,前导按钮向右跳,但我认为这可能是由于我认为其他一些代码。这段代码大量借鉴https://chariotsolutions.com/blog/post/uitableview-swipe-actions-in-ios-11/

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 

    if indexPath.section == Slider.Section.results.rawValue 
        return true
     else 
        return false
    



override func tableView(_ tableView: UITableView,
                        leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?


    let favoriteAction = self.contextualToggleFavoriteAction(forRowAtIndexPath: indexPath)

    return UISwipeActionsConfiguration(actions: [favoriteAction])



override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 


    let delete = UIContextualAction(style: .destructive,
                                    title: "Delete")  (contextAction: UIContextualAction, sourceView: UIView, completionHandler: (Bool) -> Void) in

                                        Filter.allMarkers.remove(at: indexPath.row)
                                        tableView.deleteRows(at: [indexPath], with: .fade)
                                        completionHandler(true)

    

    let share = UIContextualAction(style: .normal,
                                    title: "Share")  (contextAction: UIContextualAction, sourceView: UIView, completionHandler: (Bool) -> Void) in

                                        print("About to share -> \(Filter.allMarkers[indexPath.row].title ?? "")")
                                        completionHandler(true)

    

    share.backgroundColor = Color.ocean

    let swipeConfig = UISwipeActionsConfiguration(actions: [delete, share])
    return swipeConfig



func contextualToggleFavoriteAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction 

    let marker = Filter.allMarkers[indexPath.row]
    let action = UIContextualAction(style: .normal,
                                    title: "Favorite")  (contextAction: UIContextualAction, sourceView: UIView, completionHandler: (Bool) -> Void) in
                                        if marker.toggleFavoriteFlag() 
                                            completionHandler(true)
                                         else 
                                            completionHandler(false)
                                        
    

    //action.image = UIImage(named: "flag")
    action.backgroundColor = marker.isFavorite ? Color.magenta : UIColor.gray
    return action

【讨论】:

以上是关于如何向右滑动隐藏 UITableView 中的删除按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 UITableView 上的左右滑动手势

如何通过滑动从 Parse 中的 UITableView 中删除对象?

在uitableview单元格上留下滑动删除按钮打开然后返回导致崩溃

UINavigationBar 在中断从左边缘手势向右滑动后显示返回按钮,如何隐藏它以及为啥显示它?

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

更改 UITableViewCell 中的删除附件视图