Ios RealmSwift“;“对象已被删除或无效”;
我试图设计一个按钮,允许用户“保存”集合视图表上的列表。当按下按钮时,列表的数据将保存到realm,另一个视图控制器将显示该数据 当我第三次点击该按钮时,即使是另一个列表,我也可以将数据保存到域中,并显示和删除它。下面是一些代码,让您了解我正在尝试做什么:Ios RealmSwift“;“对象已被删除或无效”;,ios,swift,realm,Ios,Swift,Realm,我试图设计一个按钮,允许用户“保存”集合视图表上的列表。当按下按钮时,列表的数据将保存到realm,另一个视图控制器将显示该数据 当我第三次点击该按钮时,即使是另一个列表,我也可以将数据保存到域中,并显示和删除它。下面是一些代码,让您了解我正在尝试做什么: let lib = BookCollection() let realm = try! Realm() var unSavedBook = RealmBook() func save(_ cell: HomeBookPreviewVie
let lib = BookCollection()
let realm = try! Realm()
var unSavedBook = RealmBook()
func save(_ cell: HomeBookPreviewViewCell) {
// This allows me to get the indexpath of a cell to use buttons on the collection view.
guard let indexPath = self.bookListing.indexPath(for: cell) else {
print("whaaaaaaa")
return
}
if lib.Library[indexPath.item].saved {
let savedBooks = realm.object(ofType: RealmBook.self, forPrimaryKey: lib.Library[indexPath.item].isbn!)
try! realm.write {
realm.delete(savedBooks!)
//updates other view controller
NotificationCenter.default.post(name: .reload, object: nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName: "Star"), for: .normal)
lib.Library[indexPath.item].saveBook(save: false)
}
else if (!lib.Library[indexPath.item].saved) {
try! realm.write {
//unSavedBooks is declared outside of function.
//lib.Libary is an object that holds an array of Book objects with book attributes.
unSavedBook.addRealmBook(lib.Library[indexPath.item].title!, lib.Library[indexPath.item].author!, lib.Library[indexPath.item].edition!, lib.Library[indexPath.item].publisher!, "\(lib.Library[indexPath.item].type!)", "\(lib.Library[indexPath.item].condition!)", "\(lib.Library[indexPath.item].subject!)", lib.Library[indexPath.item].seller!, RealmOptional<Float>(lib.Library[indexPath.item].price), lib.Library[indexPath.item].isbn!)
realm.add(unSavedBook)
//updates other view controller
NotificationCenter.default.post(name: .reload, object: nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName: "Star-Saved"), for: .normal)
lib.Library[indexPath.item].saveBook(save: true)
}
print("Button tapped on row \(indexPath.item)")
}
let lib=BookCollection()
让我试试!领域()
var unSavedBook=RealmBook()
func save(u单元格:HomeBookPreviewViewCell){
//这允许我获取单元格的indexpath,以便使用集合视图上的按钮。
guard let indexath=self.bookListing.indexath(for:cell)else{
印刷品(“Whaaaaaa”)
回来
}
如果lib.Library[indexath.item].已保存{
让savedBooks=realm.object(类型:RealmBook.self,forPrimaryKey:lib.Library[indexPath.item].isbn!)
试试看!写吧{
realm.delete(savedBooks!)
//更新其他视图控制器
NotificationCenter.default.post(名称:。重新加载,对象:nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName:“Star”),用于:。正常)
lib.Library[indexath.item].saveBook(保存:false)
}
如果(!lib.Library[indexath.item].saved),则为else{
试试看!写吧{
//未录制的图书在函数外声明。
//Libary是一个对象,它包含一系列具有图书属性的图书对象。
unSavedBook.addRealmBook(lib.Library[indexath.item].title!、lib.Library[indexath.item].author!、lib.Library[indexath.item].edition!、lib.Library[indexath.item].publisher!、“\(lib.Library[indexath.item].condition!)、“\(lib.lib.Library[indexath.item].subject!)、lib.Library[indexath.item].seller!,RealmOptional(lib.Library[indexath.item].price),lib.Library[indexath.item].isbn!)
realm.add(unSavedBook)
//更新其他视图控制器
NotificationCenter.default.post(名称:。重新加载,对象:nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName:“星形已保存”),用于:。正常)
lib.Library[indexath.item].saveBook(保存:true)
}
打印(“在行\(indexPath.item)上点击按钮”)
}
我知道我需要使用保存的布尔值来加载数据,但我不明白为什么它不允许我第三次单击。当您尝试读取最有可能已删除的领域对象的属性时,您会看到此异常。请确保您没有任何对已删除领域对象的强引用,或者尝试使用
isInvalidated
属性来处理该情况。我在开发iOS时使用CoreData+Magic record。只有当我开发安卓应用程序时,才有领域
两个问题
NotificationCenter.default.post(名称:.reload,对象:nil)
调用有点困惑。另外,您能否向我们展示您的集合视图数据源委托方法实现?因为其中包含一些领域调用集合视图
,每个单元格显示一本书籍
。如果单击书本
单元格1,它将显示另一个视图以显示书本信息。如果你第二次点击它,你就会删除这本书。但是如果那本书被删除了,为什么use可以第三次点击那个单元格呢?您是否希望删除书本
单元格?发布几张截图,我们很乐意帮助您:)你能发布更多的代码吗?因为我有点混淆了多个变量,比如
lib.Library[indexath.item].saved
。顺便说一句,你能发布几张截图吗,如果有一个清晰的idea@PangHoMing对其进行了编辑以使其更清晰一些,对于混乱的代码表示抱歉(我打算在以后删除它,因为我必须添加另一个组件。)