在 UITableView 单元格滑动中选择“删除”,但未调用“提交编辑样式”

Posted

技术标签:

【中文标题】在 UITableView 单元格滑动中选择“删除”,但未调用“提交编辑样式”【英文标题】:Selecting 'Delete' in UITableView cell swipe, but 'commit editingStyle' not called 【发布时间】:2019-02-14 18:13:34 【问题描述】:

我有以下 -

    class BTTableView: UITableView, UITableViewDelegate, UITableViewDataSource

用这些方法-

    public func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
        return true
    

    public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle 
        return .delete
    

    public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
    
        print("editingStyle")
    

当我在单元格上左滑时,“删除”选项按预期显示 - Delete action shown

如果我 -

    点击删除,上面带参数'commit editingStyle'的方法不会被调用 一直向左滑动到视图的左侧,而不是在出现 Delete 时停止,调用该方法。

在我看来,此方法将同时使用#1 和#2 调用。

谁能帮我理解我做错了什么?

编辑 - 根据 DonMag 的意见,解决了以下问题:

     override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
        if let hitView = super.hitTest(point, with: event) 
            let isSwipeButton = String(describing: type(of: hitView)) ==  "UISwipeActionStandardButton"
            if hitView.isKind(of: BTTableCellContentView.self)  || isSwipeButton 
                return hitView
            
        
        return nil;
    

【问题讨论】:

如果你的类是UITableView的子类,那些方法不应该是override吗? 编辑:抱歉,刚刚发现不是UITableViewController.... 嗯...我刚刚试了一下,完全滑动和部分滑动和点击都调用了commit。您的代码中还有其他内容吗?也许尝试一个简单的例子? 我认为您也存在架构问题。你的 UITableView 子类不应该是它自己的数据提供者。 我将分享更多关于我的设置的信息。我正在尝试使 BTNavigationDropdownMenu 支持滑动删除。我已经下载了项目,按照我的问题对 BTTableView 类进行了更改,并在我的 Podfile 中指向生成的构建产品。 @DaveLargent - 为了将来参考,最好在发布问题时提供所有的相关信息。 【参考方案1】:

似乎commit 没有被调用,因为该类覆盖了hitTest

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
    if let hitView = super.hitTest(point, with: event) , hitView.isKind(of: BTTableCellContentView.self) 
        return hitView
    
    return nil;

并返回nil,因为hitView 是操作按钮。

简单地删除它可能/会导致问题(首先注意到的是“下拉”在点击它外部时不会关闭)。

所以您需要编辑该函数...可能需要做一些工作,但这是开始的地方。

【讨论】:

遇到了同样的问题,这让我得到了这个答案。在我的例子中,我在整个视图中添加了一个点击手势识别器,以便用户可以点击键盘以外的任何地方来关闭它。谢谢!【参考方案2】:

你很可能忘记写了:

self.delegate = self
self.dataSource = self

【讨论】:

感谢您的帮助。我检查了 BTNavigationDropdownMenu 的源代码,并且存在这两个调用。

以上是关于在 UITableView 单元格滑动中选择“删除”,但未调用“提交编辑样式”的主要内容,如果未能解决你的问题,请参考以下文章

在 iphone sdk 中一起滑动以删除和移动 UItableView 选项中的单元格

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

iOS 7 UITableView 问题 - 当我们已经有一个单元格时尝试设置滑动以删除单元格

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

如何制作可滑动的 UItableview 标题以显示像单元格一样的删除按钮

滑动删除 UITableView 单元格动画在 swift 2 中不起作用