我正在尝试设计一个按钮,允许用户在集合视图表上“保存”列表。触摸按钮时,列表的数据将保存到领域,另一个视图控制器会显示此数据。
虽然我能够将数据保存到Realm并显示并删除它,如果我再次点击该按钮,如果我第三次点击它“对象已被删除或无效”,即使它是不同的清单。这是代码,可以让我们深入了解我正在尝试做的事情:
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)")
}
我知道我需要使用已保存的布尔值来加载数据,但我不明白为什么它不允许我第三次点击。
答案 0 :(得分:1)
当您尝试读取很可能已被删除的领域对象的属性时,您会看到此异常。请确保您没有对已删除的域对象的任何强引用,或尝试使用isInvalidated
属性来处理该情况。
答案 1 :(得分:0)
我开发iOS时曾经使用过CoreData + Magical记录。而且只有当我开发Android应用程序时才能使用Realm。
夫妻问题,
NotificationCenter.default.post(name: .reload, object: nil)
电话有点困惑。另外,您能向我们展示您的Collection View数据源委托方法实现吗?因为那里有一些Realm电话。Collection View
,每个单元格显示Book
。如果单击Book
单元格,则会显示另一个视图以显示书籍信息。如果您第二次单击它,则会删除该书。但如果该书被删除,为什么使用可以第三次点击该单元?您是否期望删除Book
单元格?发布几张截图对我们来说很有帮助:))