【发布时间】:2019-06-23 01:47:31
【问题描述】:
我已经能够将数据保存在 Realm 数据库中,但无法在 SwiftUI List 中显示结果。
我知道我有数据并且在控制台中打印结果没有问题。
有没有办法将 Realm Result 转换为可以在 SwiftUI List 上显示的格式?
import SwiftUI
import RealmSwift
import Combine
class Dog: Object {
@objc dynamic var name = ""
@objc dynamic var age = 0
override static func primaryKey() -> String? {
return "name"
}
}
class SaveDog {
func saveDog(name: String, age: String) {
let dog = Dog()
dog.age = Int(age)!
dog.name = name
// Get the default Realm
let realm = try! Realm()
print(Realm.Configuration.defaultConfiguration.fileURL!)
// Persist your data easily
try! realm.write {
realm.add(dog)
}
print(dog)
}
}
class RealmResults: BindableObject {
let didChange = PassthroughSubject<Void, Never>()
func getRealmResults() -> String{
let realm = try! Realm()
var results = realm.objects(Dog.self) { didSet
{didChange.send(())}}
print(results)
return results.first!.name
}
}
struct dogRow: View {
var dog = Dog()
var body: some View {
HStack {
Text(dog.name)
Text("\(dog.age)")
}
}
}
struct ContentView : View {
@State var dogName: String = ""
@State var dogAge: String = ""
let saveDog = SaveDog()
@ObjectBinding var savedResults = RealmResults()
let realm = try! Realm()
let dogs = Dog()
var body: some View {
VStack {
Text("Hello World")
TextField($dogName)
TextField($dogAge)
Button(action: {
self.saveDog.saveDog(name: self.dogName,
age:self.dogAge)
// self.savedResults.getRealmResults()
}) {
Text("Save")
}
//insert list here to show realm data
List(0 ..< 5) {
item in
Text(self.savedResults.getRealmResults())
} //Displays the same thing 5 times
}
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
有些代码可能没有意义,因为我尝试了几种方法来查看是否可行。
例如,这一行将在列表视图中显示结果。
return results.first!.name
如果我只返回结果,列表文本视图中不会显示任何内容。
正如我在下面评论的那样,我将在有时间时尝试 ForEach 方法。这看起来很有希望。
【问题讨论】:
-
您遇到了什么错误?
-
我无法遍历结果来显示它们。我可以显示 .first 或 .last 但不能在列表中显示所有结果。似乎它可以处理一组 json 数据,但不知道如何处理领域数据。我不知道 ForEach 是否也有效。
-
您可以直接使用 Result 或 List Realm Object,其方式与数组非常相似。但是,如果没有看到您的尝试,我们将无法(正确地)回答问题。另请注意,您遇到的问题是 SwiftUI 和 Realm 都有一个 List 对象。标记为重复,因为发布的解释将提供答案。
-
另请注意,如果您将数据从结果对象复制到其他对象、数组、列表等,它会“中断”与父对象的连接,因此它们将不再是实时更新对象。如果你有一个结果监听器,它也会破坏它。