通过滑动删除行在表格视图中无法正常工作

Posted

技术标签:

【中文标题】通过滑动删除行在表格视图中无法正常工作【英文标题】:Deleting row by swipe not working propery in tableview 【发布时间】:2020-09-13 16:09:28 【问题描述】:

我使用 mvvm 架构构建了一个应用程序。我不知道为什么func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 它没有在我的视图控制器上被调用(基本上滑动不起作用,它可以像 1/20 一样工作)。如果我用它的方法构建表视图(基本视图)到另一个视图控制器,它工作得很好。我尝试从头开始构建我的视图控制器,但它也不影响结果,所以问题肯定出在控制器的功能上。

我的代码在哪里滑动效果很好(我这样做只是为了检查它是否在我的应用中有效:)

class tbViewController: UIViewController 
    @IBOutlet weak var tableview: UITableView!
    private var data = ["1","2","3","4"]
    
    override func viewDidLoad() 
        super.viewDidLoad()
        tableview.delegate = self
        tableview.dataSource = self
    

extension tbViewController: UITableViewDataSource
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.data.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = self.data[indexPath.row]
        return cell
    
    
    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    
    
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
        return true
    
    
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle 
        return .delete
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            tableView.beginUpdates()
            self.data.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            tableView.endUpdates()
        
    

我的原始视图控制器滑动不起作用,我还将原始 tableview 与上面的一个交换,只是为了验证问题是否来自 tableview...我无法得到它:C。 (请检查第一个 tableview 方法):

class ExpensesViewController: UIViewController, ChartViewDelegate 
    
    @IBOutlet private weak var thisWeek: UIButton!
    @IBOutlet private weak var thisMonth: UIButton!
    @IBOutlet private weak var thisYear: UIButton!
    @IBOutlet private weak var totalExpensedAmount: UILabel!
    @IBOutlet private weak var pieChart: PieChartView!
    @IBOutlet private weak var tableView: UITableView!
    
    private var menu: SideMenuNavigationController?
    private var tableViewActions = [Action]()
    private var expensesViewModel = ExpensesViewModel()
    private var data = ["1","2","3","4"]
    
    override func viewDidLoad() 
        super.viewDidLoad()
        initSideBar()
        customizeButtons()
        customizePieChart()
        self.tableView.delegate = self
        self.tableView.dataSource = self
    
    
    @IBAction func didTapMenu()
        present(self.menu!, animated: true)
    
    
    @IBAction func onClickThisWeek(_ sender: UIButton) 
        setGrayBackgroundAndBlackTitleColor(for: self.thisMonth, and: self.thisYear)
        sender.backgroundColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        sender.setTitleColor(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), for: UIControl.State.normal)
    
    
    @IBAction func onClickThisMonth(_ sender: UIButton) 
        setGrayBackgroundAndBlackTitleColor(for: self.thisWeek, and: self.thisYear)
        sender.backgroundColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        sender.setTitleColor(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), for: UIControl.State.normal)
    
    
    @IBAction func onClickThisYear(_ sender: UIButton) 
        setGrayBackgroundAndBlackTitleColor(for: self.thisWeek, and: self.thisMonth)
        sender.backgroundColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        sender.setTitleColor(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), for: UIControl.State.normal)
    
    
    private func setGrayBackgroundAndBlackTitleColor(for button1: UIButton, and button2: UIButton)
        button1.backgroundColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)
        button2.backgroundColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)
        button1.setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: UIControl.State.normal)
        button2.setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: UIControl.State.normal)
    
    
    
    private func initSideBar()
        self.menu = SideMenuNavigationController(rootViewController: MenuListController())
        self.menu?.leftSide = true
        self.menu?.setNavigationBarHidden(true, animated: false)
        SideMenuManager.default.leftMenuNavigationController = self.menu
        SideMenuManager.default.addPanGestureToPresent(toView: self.view)
    
    
    private func customizeButtons()
        self.thisWeek.setTitleColor(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), for: UIControl.State.normal)
        self.thisWeek.backgroundColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        self.thisWeek.layer.borderColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        self.thisMonth.layer.borderColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
        self.thisYear.layer.borderColor = #colorLiteral(red: 0.05509413034, green: 0.7074701786, blue: 0.4755263329, alpha: 1)
    
    
    private func customizePieChart()
        self.pieChart.delegate = self
        self.pieChart.noDataText = "You don't have any income, to display quarters income."
        self.pieChart.legend.enabled = false
        let pieChartAttribute = [ NSAttributedString.Key.font: UIFont(name: "Arial", size: 16.0)!, NSAttributedString.Key.foregroundColor: UIColor.init(displayP3Red: 0.462, green: 0.838, blue: 1.000, alpha: 1) ]
        let pieChartAttrString = NSAttributedString(string: "Quarterly Revenue", attributes: pieChartAttribute)
        self.pieChart.centerAttributedText = pieChartAttrString
    



extension ExpensesViewController: UITableViewDataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.data.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = self.data[indexPath.row]
        return cell
    
    
    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    
    
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
        return true
    
    
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle 
        return .delete
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            tableView.beginUpdates()
            self.data.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            tableView.endUpdates()
        
    

原始屏幕应该是怎样的:

我的屏幕现在怎么样了,我基本上推荐了所有功能,不要让你感到困惑,我的所有业务逻辑都在哪里,这就是为什么什么都没有显示,只是一些 UI 改变,视图模型不与控制器交互(如你所见在我上面的代码中):

如果您遇到此类错误,请帮助我。非常感谢。

【问题讨论】:

【参考方案1】:

我会尝试使用这个:https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview

前导滑动也有类似的功能。

【讨论】:

【参考方案2】:

“我不知道为什么 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 它没有在我的视图控制器上被调用”。

您的方法没有被调用的原因是您忘记在视图控制器的声明中添加它应该是UITableViewDelegate

注意:使用beginUpdates 方法删除/删除单行毫无意义。顺便说一句,在进行多次插入/删除时,最好使用 performBatchUpdastes。最后但同样重要的是,Swift 命名约定以大写字母开头的类命名。

【讨论】:

感谢您的建议,我没有添加'UITableViewDelegate'协议,因为不需要实现符合该协议的方法。顺便说一句,我添加了,它也不起作用,该类只是用于测试。 你试过extension tbViewController: UITableViewDelegate, UITableViewDataSource 吗? developer.apple.com/documentation/uikit/uitableviewdelegate • 响应表格行中的滑动和其他操作。 是的...这不是问题所在。我刚刚发现了错误,我已经实现了我的侧边菜单,从左向右滑动。基本上,我认为它们与 tableview 滑动有冲突或 smth 并且它不能正常工作。我刚刚删除了sidemenu的init,它工作得很好。也非常感谢您的倡议。 你的意思是这不是唯一的问题。我敢在不将视图控制器设置为 tableview 委托的情况下滑动删除作品。

以上是关于通过滑动删除行在表格视图中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 滑动删除在 iOS8 上无法正常工作

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

如果 UITableView 在 UIScrollView 中,则无法在 UITableView 上执行滑动删除

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

滑动删除 UITableViewCell 很难触发

使用 NSFetchedResultsController 滑动以删除表格中的单元格