以下代码正确显示 Realm
中的所有“用户” SwiftUI 中的数据库 List
.我的问题是滑动一行时删除记录。
当我滑动一行并点击删除按钮时,我立即得到一个 uncaught exception
错误,List
没有更新,但我知道正确的项目已从 Realm
中删除数据库,因为我下次运行应用程序时选择的记录没有显示出来。
这是我的代码。
SwiftUI 代码
import RealmSwift
struct ContentView: View {
@State private var allUsers: Results<User> = realm.objects(User.self)
var body: some View {
VStack{
Text("Second Tab")
List{
ForEach(allUsers, id:\.self) { user in
HStack{
Text(user.name)
Text("\(user.age)")
}
}.onDelete(perform: deleteRow)
}
}
}
private func deleteRow(with indexSet: IndexSet){
indexSet.forEach ({ index in
try! realm.write {
realm.delete(self.allUsers[index])
}
})
}
}
Realm 模型
import RealmSwift
class User:Object{
@objc dynamic var name:String = ""
@objc dynamic var age:Int = 0
@objc dynamic var createdAt = NSDate()
@objc dynamic var userID = UUID().uuidString
override static func primaryKey() -> String? {
return "userID"
}
}
错误
Terminating app due to uncaught exception 'RLMException', reason: 'Index 4 is out of bounds (must be less than 4).'
当然,
4
根据 Realm
中的项目数量而变化数据库,在这种情况下,当我滑动并点击删除按钮时,我有 5 条记录。我的期望是
List
每次allUsers
都会更新@State 变量更改,我知道我的问题不是完全理解绑定(bind)是如何工作的。我究竟做错了什么?
最佳答案
My expectation was that the List was going to update every time the allUsers @State variable changes
这是正确的,但状态没有改变......以下应该工作
private func deleteRow(with indexSet: IndexSet){
indexSet.forEach ({ index in
try! realm.write {
realm.delete(self.allUsers[index])
}
})
self.allUsers = realm.objects(User.self) // << refetch !!
}
注意:下面只是分配初始状态值
@State private var allUsers: Results<User> = realm.objects(User.self)
关于ios - 如何从 SwiftUI 列表和 Realm 中删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61165998/