Ios Swift领域例外
在homeViewController上,我有一个带有单元格的表格视图。Ios Swift领域例外,ios,swift,realm,Ios,Swift,Realm,在homeViewController上,我有一个带有单元格的表格视图。 单元格中填充了来自领域数据库的数据。 每个单元格都可以删除。 删除单元格后,一切正常。 当我转到另一个viewController,然后再次返回主页时,应用程序崩溃,原因: “对象已被删除或无效。” 有什么想法吗?重新加载数据和类似内容没有帮助。 我是个新手 这是我将数据从领域读取到表的地方 override func viewWillAppear(_ animated: Bool) { //tableView.r
单元格中填充了来自领域数据库的数据。
每个单元格都可以删除。
删除单元格后,一切正常。
当我转到另一个viewController,然后再次返回主页时,应用程序崩溃,原因: “对象已被删除或无效。” 有什么想法吗?重新加载数据和类似内容没有帮助。
我是个新手 这是我将数据从领域读取到表的地方
override func viewWillAppear(_ animated: Bool) {
//tableView.reloadData()
let realm = try! Realm()
let result = realm.objects(CardsetTable.self)
for r in result {
self.cardsets.append(r)
}
for x in cardsets{
self.titles.append(x)
}
self.tableView.reloadData()
}
这就是我删除单元格和领域数据的地方:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let newSet = CardsetTable()
newSet.cards = self.titles[indexPath.row].cards
newSet.size = self.titles[indexPath.row].size
newSet.title = self.titles[indexPath.row].title
newSet.id = self.titles[indexPath.row].id
let realm = try! Realm()
try! realm.write {
realm.delete(realm.objects(CardsetTable.self).filter("title=%@",titles[indexPath.row].title))
}
titles.remove(at: indexPath.row)
}
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .automatic)
tableView.reloadData()
tableView.endUpdates()
}
这里有几点需要改进。 在视图中,您将从领域中获取结果,并在您的
editingStyle:
方法中再次执行相同的操作,这是不必要的
let result = realm.objects(CardsetTable.self)
您正在将结果添加到数组self.cardsets,这是不需要的。您可以将结果
用作数组,并基于索引访问其元素
有一种可能是您在viewwillbeen
中添加了不必要的领域元素,因为viewwillbeen
可能会被多次调用,您需要注意将领域元素添加到数组中,因为如果您不删除以前添加的元素,它们会重复
说到编辑风格方法
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let newSet = CardsetTable()
newSet.cards = self.titles[indexPath.row].cards
newSet.size = self.titles[indexPath.row].size
newSet.title = self.titles[indexPath.row].title
newSet.id = self.titles[indexPath.row].id
let realm = try! Realm()
try! realm.write {
realm.delete(realm.objects(CardsetTable.self).filter("title=%@",titles[indexPath.row].title))
}
titles.remove(at: indexPath.row)
}
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .automatic)
tableView.reloadData()
tableView.endUpdates()
}
实际上,我不知道为什么要创建一个新的领域对象let newSet=cardsetable()
,而不使用它
在这一行:
realm.delete(realm.objects(CardsetTable.self).filter("title=%@",titles[indexPath.row].title))
您正在从域数据库重新获取项目。这也是不必要的。您可以在预取的领域数组self.cardsets
错误的可能性有很多。它表示您试图删除的对象已被删除或不再有效
我认为有两个可能的原因:
1-realm.objects(cardsetable.self)返回的一个领域对象已被删除
2-titles[indexPath.row]返回一个领域对象,然后访问.title将导致错误,因为titles[indexPath.row]已从数据库中删除
您始终可以验证对象是否无效
if (!rlmObj.isInvalidated){
// delete
}
正如dávid-pászor所说,您不应该从BeginUpdate操作内部调用重载数据 您的崩溃可能与未在此处显示的代码有关。如何显示表格单元格以及如何使用存储在卡片集和标题中的领域对象。这可能是导致崩溃的原因,因为您的视图控制器正在保留已从域中删除的域对象 当从域中删除项目时,您需要更新卡集和标题
旁注,为什么要将相同的领域对象存储在两个不同的数组中?您需要在问题中以a的形式包含所有相关代码,以便在主题上提出问题。这可能不是问题的原因,但肯定是一个问题:您应该移动所有代码,将
beginUpdates…
包含在if
语句中。此外,决不能在beginUpdates
块内调用reloadData
。endUpdates
块reloadData
重新加载整个tableview,这是您不想要的,因为通过调用beginUpdate
您告诉iOS您正在对table view进行手动更新(实际上是使用deleteRows
),标题数组的类型是什么?可以设置吗?新闻集有什么意义?没有新闻集。。。忘了删除它。标题的类型是CardsetTable,是的。一个可能的问题是,每次导航回viewController时,都会用其他信息填充tableView数据源。因此,当您第一次查看控制器时,将从Realm加载3个对象并将其放入数据源数组中。然后从viewController中移开并返回(假设viewController未解除分配),它再次调用该函数并在已加载的3个对象上再加载3个对象。请记住,视图将出现
,因为您可能会在视图之间来回切换,每次视图即将出现在屏幕上时都会调用它。我按照David所说的重新加载数据,但它仍然崩溃。我存储在2个不同的数组中,以使搜索栏更容易。@faris97。在运行BeginUpdate之前,您需要在从tableView(tableView:UITableView,commit editingStyle)中的域中删除后立即更新这些数组。一旦从域中删除对象,可能保留该对象的任何属性都需要更新。谢谢帮助,但删除不再是问题,我的应用程序也不会崩溃。你能读一下我在回答下面评论部分的最后一条评论吗?谢谢。谢谢你的帮助,但删除和查看将不再是问题,我的应用程序也不会崩溃。你能读一下我在回答下面评论部分的最后一条评论吗?谢谢