在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥
Posted
技术标签:
【中文标题】在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥【英文标题】:What is the right way to present data from Realm in SwiftUI List在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是什么 【发布时间】:2020-04-11 16:29:35 【问题描述】:我正在尝试从 Realm
获取所有项目并将它们显示在 SwiftUI List
中,但我一直收到错误消息。
在UIKit/Realm
应用程序中,我只需创建一个Results
变量来存储来自Realm
的所有项目,然后我将在viewDidLoad
方法中获取项目并将它们分配给该变量。我正在尝试在SwiftUI
中做同样的事情,但我不确定如何构建我的代码,我一直收到错误消息说我的Realm
模型应该符合StringProtocol
,我很确定这与我对SwiftUI
中的Binding
缺乏了解有关。
同样,我要做的只是从Realm
获取所有项目并将它们显示在SwiftUI List
中。
这就是我所拥有的。
领域对象:
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"
SwiftUI 代码:
struct ContentView: View
@State private var allUsers : Results<User>!
var body: some View
VStack
List
ForEach(allUsers, id:\.self) user in
Text(user) // the error points here
.onAppear()
self.updateUserResults()
func updateUserResults()
allUsers = realm.objects(User.self)
错误:
Initializer 'init(_:)' 要求 'User' 符合 'StringProtocol'
我错过了什么?
【问题讨论】:
【参考方案1】:你可能是这个意思
ForEach(allUsers, id:\.self) user in
Text(user.name)
【讨论】:
这绝对消除了错误,现在我在ForEach(allUsers, id:\.self) user in
中收到错误Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
。在.onAppear()
中调用self.updateUserResults()
看起来不错吗?我可能在获取用户之前加载了List
。谢谢
@fs_tigre,确实如此。您必须为allUsers
提供一些默认的空值。
嗯,我真的不知道如何添加默认值。我尝试将allUsers
设为可选但没有运气。仅供参考 - 我确定我在 Realm
数据库中有记录。谢谢
我更改了allUsers
以获取变量声明@State private var allUsers: Results<User> = realm.objects(User.self)
处的所有用户,现在它可以工作了。我会将您的答案标记为正确的答案,因为它使我找到了解决方案。以上是关于在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SwiftUI 和 Realm 中另一个列表中的对象中添加和删除列表中的对象