ios - EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)当deleteRows(在: [IndexPath])

标签 ios swift uitableview

我正在开发一个应用程序,它在主屏幕上有一个主表格 View 。当我点击表格 View 的某种类型的单元格时,我会执行一些动画,然后删除该单元格。我在所有模拟器上尝试了该行为。仅在 4,7"和 5,5"上,当我尝试系统地删除某一行时,会发生崩溃。我无法理解该错误,因为 Xcode 只显示:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

这是我的代码:

    tableView.deselectRow(at: indexPath, animated: false)
        let incomingReminderTableViewCell = cell as! IncomingReminderTableViewCell
        self.tableView.isUserInteractionEnabled = false
        incomingReminderTableViewCell.completeReminderAt(indexPath: indexPath) { (indexPath) in
            let selectedReminder = self.incomingReminders.reversed()[indexPath.row-1]
            if CoreDataManager.sharedInstance.delete(selectedReminder) {
                UserNotificationManager.decreaseBadge()
                UserNotificationManager.deleteNotificationsWith(identifiers: [selectedReminder.idNotification])
                self.incomingReminders = self.incomingReminders.reversed()
                self.incomingReminders.remove(at: indexPath.row-1)
                self.incomingReminders = self.incomingReminders.reversed()

                if self.incomingReminders.isEmpty {
                    UIView.animate(withDuration: 0.2, animations: {
                        incomingReminderTableViewCell.alpha = 0.0
                    }, completion: { (disappeared) in
                        self.tableView.reloadRows(at: [indexPath], with: .fade )
                        self.tableView.isUserInteractionEnabled = true
                    })
                } else {
                    UIView.animate(withDuration: 0.2, animations: {
                        incomingReminderTableViewCell.alpha = 0.0
                    }, completion: { (disappeared) in
                        self.tableView.isUserInteractionEnabled = true
                        self.tableView.deleteRows(at: [indexPath], with: .right) // HERE THE CRASH
                        self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()
                        if self.incomingReminders.count == 5 {
                            Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer) in
                                self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
                                timer.invalidate()
                            })
                        }
                    })
                }
            } else {
                self.tableView.isUserInteractionEnabled = true
            }
        }

当应用程序崩溃时,我有indexPath =(行:3,部分:0),这是正确的。数据源已正确更新,在删除行之前,我在数组中有两个元素,并且 TableView 中的数据从indexPath =(行:1,部分:0)开始。找不到解决办法。

最佳答案

不太相信,但我已经这样解决了:

tableView.performBatchUpdates({
    tableView.deleteRows(at: [indexPath], with: .right)
}, completion: { (deleted) in
    tableView.reloadData()

    self.tableView.isUserInteractionEnabled = true
    self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()

    if self.incomingReminders.count == 5 {
        Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer) in
            self.tableView.beginUpdates()
            self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
            self.tableView.endUpdates()
            timer.invalidate()
        })
    }
 })

问题是在 TableView 中删除一定数量的行后,它仍然是脏的。事实上,删除一堆行,滚动,然后继续删除,崩溃并没有发生。我需要重新加载数据。我放了

tableView.deleteRows(at: [indexPath], with: .right)

作为批量更新。在完成 block 中,我调用了重新加载以及其他内容。目前看来一切都好。希望这对某人有用。

关于ios - EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)当deleteRows(在: [IndexPath]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52115420/

相关文章:

ios - UI 测试失败 - 获取元素快照失败错误 -25201

ios - 当所有 subview 都隐藏在动画 block 中时,UIStackView 将其排列的 subview 移动到左上角

ios - 在 Swift 中添加图像过渡动画

ios - 重新加载 TableView 不起作用

iphone - 使用 UITableView 登录

ios - 如何在 Swift 中按图像大小调整 UIImageView 的大小

ios - 自动续订订阅相关查询 [服务器-用户映射]

ios - 如何在 UITableView 本身上设置 DropShadow

ios - iOS邮件客户端的UIElement是什么?

ios - UITableViewCell 删除滑动动画丑陋