从 Core Data 非标量属性更新 SwiftUI 视图

Posted

技术标签:

【中文标题】从 Core Data 非标量属性更新 SwiftUI 视图【英文标题】:Updating SwiftUI view from Core Data non scalar attribute 【发布时间】:2021-06-02 16:50:31 【问题描述】:

我有一个核心数据 NSManagedObject 实体Person,它具有一个作为 NSNumber 生成的 Bool 属性。 (未使用“使用标量类型”复选框,因此 Bool 属性变为 NSNumber) 我正在尝试观察 employed 这个属性来控制 UI。

@ObservedObject var person: Person

var body: some View 
    List 
        Section 
            HStack 
                Toggle(isOn: $person.employed)  <-- 1
                    Text("Showing employed content..")
                
            
        
        if person.employed.boolValue 
            Section   etc

我在“1”处收到警告:Cannot convert value of type 'Binding&lt;NSNumber?&gt;' to expected argument type 'Binding&lt;Bool&gt;' 如何在不将其更改为标量的情况下将 employed 属性用作布尔值?

注意:$person.employed.boolValue 似乎不起作用,我还必须考虑可选部分。

【问题讨论】:

【参考方案1】:

一种可能的方法是通过自定义Binding

Toggle("Showing employed content..", isOn: Binding<Bool>(get: 
         person.employed?.boolValue == true
      , set:  value in
         person.employed = NSNumber(value: value)
      ))  

现在,如果您希望这是一个计算属性,您可以这样做:

var isEmployed: Binding<Bool> 
    Binding<Bool>(get: 
        person.employed?.boolValue == true
    , set:  value in
        person.employed = NSNumber(value: value)
    )


var body: some View 
    Toggle("Showing employed content..", isOn: isEmployed)

此外,这是一个扩展的可能实现,它处理可选的 NSNumber 支持的布尔值(请原谅我的可怕命名):

extension Binding where Value == NSNumber? 
    var boolBinding: Binding<Bool> 
        Binding<Bool>(get: 
            self.wrappedValue == true
        , set:  value in
            self.wrappedValue = NSNumber(value: value)
        )
    

可以这样使用:

Toggle("Showing employed content..", isOn: $person.employed.boolBinding)

【讨论】:

感谢@Alladinian 的回答。它工作得很好。我很想把这个因素考虑在内,让它更干净,但不幸的是,上面 vadian 提供的解决方案似乎不起作用。我最终在 SwiftUI 中直接获取 NSManagedObject:@FetchRequest(fetchRequest:Person.anyFetchRequestHere) var person: FetchedResults&lt;Person&gt; @Zsolt 很高兴为您提供帮助。我已经更新了答案以包含更多选项。

以上是关于从 Core Data 非标量属性更新 SwiftUI 视图的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中带有 Core Data 的 KVO 通知

如何使用 Swift 在 Core Data 中组合属性?

Swift Core Data:Core Data 中的枚举 [重复]

如何在 Swift 中将可转换属性保存到 Core Data

从 Obj C 用 Swift 重写应用程序时使用 Core Data

Swift:当 didSelectRowAtIndexPath 时如何更新 Core Data 中的数据?