滑动以从 TableView 中删除不起作用

Posted

技术标签:

【中文标题】滑动以从 TableView 中删除不起作用【英文标题】:Swipe to delete from TableView not working 【发布时间】:2020-07-23 11:36:53 【问题描述】:

我只是想将“滑动删除功能”添加到我的tableView,据我所知,我唯一需要添加的是这两个功能:

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
    return true


override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle == .delete 
        self.deleteWishDelegate?.deleteWish(indexPath)
    

但这并没有做任何事情。我不能刷卡。我注意到一个奇怪的事情是我的整个View 上面有一个TransitionView,我不知道它来自哪里。但是我可以在tableViewCell 中单击Button,所以我认为它不会阻止任何东西。

有人知道这里发生了什么吗?如果您需要更多详细信息,请告诉我。

更新:

按照 cmets 中的建议,我使用了另一个函数来完成工作:

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 
    let deleteAction = UIContextualAction(style: .destructive, title: "Löschen")  _, _, completionHandler in
        self.deleteWishDelegate?.deleteWish(indexPath)
    completionHandler(true)
    
    deleteAction.backgroundColor = .red
    deleteAction.image = UIImage(systemName: "trash")
    let configuration = UISwipeActionsConfiguration(actions: [deleteAction])
    configuration.performsFirstActionWithFullSwipe = false
    return configuration

还有我的 delteWsihDelegate 函数:

extension WishlistViewController: DeleteWishDelegate 
    func deleteWish(_ idx: IndexPath)
        // remove the wish from the user's currently selected wishlist
        wishList.wishes.remove(at: idx.row)
        // set the updated data as the data for the table view
        theTableView.wishData.remove(at: idx.row)
        self.theTableView.tableView.deleteRows(at: [idx], with: .right)
        print("deleted")
    

现在的问题是,我每滑动 20-30 次才有效。有谁知道为什么会发生这种情况?

更新 2

我发现了问题所在。我在同一个视图上还有另一个GestureRecognizer。删除该功能后,该功能可以正常工作。有什么办法让两者同时工作?

【问题讨论】:

尝试使用func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 为什么你在表格视图的“提交编辑样式”方法上使用了“覆盖”。它可以在没有覆盖属性的情况下使用。 @Kirow 我在那里返回什么? @AshutoshkumarMishra 因为我在 TableViewController 的子类中 你使用的是 UITableViewController 还是 UIViewController 类? 【参考方案1】:

UITableViewDelegate 实现方法

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath)

可用于配置滑动操作 - 在您的情况下为删除。这是我在一个项目中使用的示例:

extension ExampleViewController: UITableViewDelegate 
    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 
        let deleteAction = UIContextualAction(style: .destructive,
                                              title: "Delete")  [weak self] _, _, complete in
            tableView.deleteRows(at: [indexPath], with: .automatic)
            complete(true)
        
        deleteAction.backgroundColor = .red

        return UISwipeActionsConfiguration(actions: [deleteAction])
    

    // instead of a gesture recognizer you can use this delegate method
    // it will be called whenever you tap on a cell
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        // whatever you gesture recognizer did
    

由于您在整个视图上的 GestureRecognizer 会给您带来麻烦,因此我建议您使用第三方实现或苹果公共 API 来处理关闭您的 viewController 而不是自己实现它。在这种情况下,您可以使用 viewController 的 UIModalPresentationStyle。

func startExampleViewController() 
   exampleViewController.modalPresentationStyle = .formSheet
   previousViewController.present(exampleViewController, animated: true)

【讨论】:

感谢您的回答,您能看看我在问题中的更新吗? 你试过在主线程上运行那个委托方法吗?我不完全确定您的代表是如何构成的,但每 20-30 次成功表示动画延迟或代表设置时的竞争条件。 @Chris 我刚刚看到你的更新。您是否考虑过在删除操作开始之前删除 GestureRecognizer? 我认为你理解错了。它与删除数据无关。如果我还有其他 GestureRecognzier,我什至不能“滑动删除” 祝你好运,编码愉快:)【参考方案2】:

我在 UITableViewController 中实现了删除动作,使用如下代码:-

class TestTableViewController: UITableViewController 

    var arrData =  ["test1", "test111", "test11121", "test1121", "test121", "test1123", "test13213", "test165342", ]

    override func viewDidLoad() 
        super.viewDidLoad()

    

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return arrData.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
        cell.title.text = arrData[indexPath.row]
        cell.selectionStyle = .none
        return cell
    


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

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            tableView.beginUpdates()
            arrData.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .none)
            tableView.endUpdates()
        
    


【讨论】:

感谢您的回答,但您能看看我更新的问题吗? 我在我们的项目中使用了您的“trailingSwipeActionsConfigurationForRowAt”方法,效果很好。能否添加“self.deleteWishDelegate?.deleteWish(indexPath)”方法的代码。 "extension WishlistViewController: DeleteWishDelegate",我认为你应该用“WhishlistTableViewController”更改扩展中的“WishlistViewController”类名。因为在顶部评论中您使用了“WhishlistTableViewController”作为 UITableViewController

以上是关于滑动以从 TableView 中删除不起作用的主要内容,如果未能解决你的问题,请参考以下文章

REFrostedViewController 平移手势禁用 tableview 滑动

UITableViewCell 样式字幕多行不起作用

手势识别器滑动以从核心数据中删除

swift - 从 var(UITextField 输入)中删除空格不起作用

当用户开始在 UIImageView 上滑动时,UITableView 滑动操作不起作用

调用 array.removeAll() 后 tableview.reload 不起作用 swift 5