K. *_*Law 2 realm swift swiftui
我已经能够将数据保存在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
Run Code Online (Sandbox Code Playgroud)
某些代码可能没有意义,因为我正在尝试几种方法来查看是否有任何效果。
例如,此行将在列表视图中显示结果。
return results.first!.name
Run Code Online (Sandbox Code Playgroud)
如果我只是返回结果,则列表文本视图中什么也不会显示。
正如我在下面评论的,我将在有空的时候尝试使用ForEach方法。这看起来很有希望。
您传入List或传递的数据ForEach必须符合Identifiable协议。
您可以在Realm模型中采用它,也可以使用.identified(by:)方法。
即使这样,View如果数据更改,也不会重新加载。
您可以将Results其包装并设为BindableObject,以便视图可以检测到更改并重新加载自身:
class BindableResults<Element>: ObservableObject where Element: RealmSwift.RealmCollectionValue {
var results: Results<Element>
private var token: NotificationToken!
init(results: Results<Element>) {
self.results = results
lateInit()
}
func lateInit() {
token = results.observe { [weak self] _ in
self?.objectWillChange.send()
}
}
deinit {
token.invalidate()
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
struct ContentView : View {
@ObservedObject var dogs = BindableResults(results: try! Realm().objects(Dog.self))
var body: some View {
List(dogs.results.identified(by: \.name)) { dog in
DogRow(dog: dog)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |