在 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&lt;User&gt; = realm.objects(User.self) 处的所有用户,现在它可以工作了。我会将您的答案标记为正确的答案,因为它使我找到了解决方案。

以上是关于在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

从 SwiftUI 列表和领域中删除记录时出错

如何从 SwiftUI 和 Realm 中另一个列表中的对象中添加和删除列表中的对象

SwiftUI + Realm:从列表中删除一行会导致异常“RLMException”,原因:“对象已被删除或失效。”

如何从 SwiftUI 列表和领域中删除数据

如何在 SwiftUI 中使用 Realm

从公共 API 获取 JSON 以在 SwiftUI 的列表视图中呈现