从 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<NSNumber?>' to expected argument type 'Binding<Bool>'
如何在不将其更改为标量的情况下将 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<Person>
@Zsolt 很高兴为您提供帮助。我已经更新了答案以包含更多选项。以上是关于从 Core Data 非标量属性更新 SwiftUI 视图的主要内容,如果未能解决你的问题,请参考以下文章
Swift Core Data:Core Data 中的枚举 [重复]
如何在 Swift 中将可转换属性保存到 Core Data