【问题标题】:Updating SwiftUI view from Core Data non scalar attribute从 Core Data 非标量属性更新 SwiftUI 视图
【发布时间】: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 似乎不起作用,我还必须考虑可选部分。

【问题讨论】:

    标签: core-data swiftui observedobject


    【解决方案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 很高兴为您提供帮助。我已经更新了答案以包含更多选项。
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2020-10-21
    • 2021-03-23
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多