从 Core Data 非标量属性更新 SwiftUI 视图
Updating SwiftUI view from Core Data non scalar attribute
我有一个 Core Data NSManagedObject 实体 Person
,它有一个 Bool 属性,我将它生成为一个 NSNumber。 (未使用“使用标量类型”复选框,因此 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<NSNumber?>' to expected argument type 'Binding<Bool>'
如何在不将其更改为标量的情况下将 employed
属性用作布尔值?
注意:$person.employed.boolValue
好像不行,我还要考虑可选部分。
一种可能的方法是通过自定义 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)
我有一个 Core Data NSManagedObject 实体 Person
,它有一个 Bool 属性,我将它生成为一个 NSNumber。 (未使用“使用标量类型”复选框,因此 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<NSNumber?>' to expected argument type 'Binding<Bool>'
如何在不将其更改为标量的情况下将 employed
属性用作布尔值?
注意:$person.employed.boolValue
好像不行,我还要考虑可选部分。
一种可能的方法是通过自定义 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)