Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 删除行时EXC_错误访问(代码=EXC_I386_GPFLT)(位于:[IndexPath])_Ios_Swift_Uitableview - Fatal编程技术网

Ios 删除行时EXC_错误访问(代码=EXC_I386_GPFLT)(位于:[IndexPath])

Ios 删除行时EXC_错误访问(代码=EXC_I386_GPFLT)(位于:[IndexPath]),ios,swift,uitableview,Ios,Swift,Uitableview,我正在开发一个应用程序,它在主屏幕上有一个主表视图。当我点击tableview中某一类型的单元格时,我会制作一些动画,然后删除该单元格。我在所有模拟器上都试过这种行为。只有在4,7英寸和5,5英寸时,当我试图系统地删除某一行时,我才会崩溃。我无法理解这个错误,因为Xcode只说:EXC\u坏访问(code=EXC\u I386\u GPFLT) 这是我的代码: tableView.deselectRow(at: indexPath, animated: false) le

我正在开发一个应用程序,它在主屏幕上有一个主表视图。当我点击tableview中某一类型的单元格时,我会制作一些动画,然后删除该单元格。我在所有模拟器上都试过这种行为。只有在4,7英寸和5,5英寸时,当我试图系统地删除某一行时,我才会崩溃。我无法理解这个错误,因为Xcode只说:EXC\u坏访问(code=EXC\u I386\u 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
            }
        }

当应用程序崩溃时,我有indexath=(行:3,节:0),这是正确的。数据源已正确更新,在deleteRows之前,数组中有两个元素,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)

作为批处理更新。在完成块中,我称之为重新加载,还有其他东西。现在一切似乎都好了。希望这对其他人有用。

请在该行上设置断点/在调用之前打印对象,并确保您的“tableView”实际上是UITableView。我这样做了,一切正常。但我发现了另外一件事:如果我在使tableview崩溃之前稍微滚动一下,崩溃就不会发生。我在调试中启用了Zombies对象,并在控制台中收到以下消息:-[UIImageView retain]:消息发送到解除分配的实例0x7ffbb0918c70。我认为这是一个单元重用的问题:我指的是单元的一个元素(imageview),它已经被释放,因为它的行已经不存在了。但我不知道怎么解决它。。。更新数据源后调用tableView.deleteRows来更新tableView还不够吗?