1

我的 SwiftUI 分段控件选择器使用纯 Int ".tag(1)" 等值进行选择。

CoreData 只有 Int16、Int32 和 Int64 选项可供选择,对于这些选项中的任何一个,似乎我的选择器选择和 CoreData 拒绝相互交谈。

请问这个(??简单的??)任务是如何实现的?

我已经尝试过 CoreData 中所有基于数字的选项,包括 Int16-64、双精度和浮点数,它们都破坏了我的代码,或者根本不起作用。

Picker(selection: $addDogVM.gender, label: Text("Gender?")) {
    Text("Boy ♂").tag(1)
    Text("?").tag(2)
    Text("Girl ♀").tag(3)
}

我希望 3 个 CoreData Int 选项中的任何一个都能开箱即用,并与选择器使用的(标准) Int 兼容。

4

1 回答 1

1

分段控件的每个元素都由一个类型的索引表示Int,因此该索引从 开始0

因此,使用具有三个段的分段控件示例(例如:男孩 ♂、?、女孩 ♀),每个段由三个索引 0、1 和 2 表示。

如果用户选择代表 Girl ♀ 的分段控件,则...

segmentedControl.selectedSegmentIndex = 2

当使用 Core Data 框架存储一个值时,即在 UI 中表示为分段控制索引时,我总是以0.

从现在开始,您阅读的所有内容都是程序员的偏好——也就是说,需要明确的是——有多种方法可以实现相同的结果,您应该选择最适合您和您的编码风格的一种。另请注意,这可能会让新手感到困惑,因此我鼓励您耐心等待。我唯一的建议是,在您经过测试、调试和测试足以理解差异之前,让事情尽可能简单。

所以继续:

苹果文档指出...

...在 64 位平台上,Int 与 Int64 大小相同。

因此,在 Core Data 模型编辑器(.xcdatamodeld文件)中,我选择为将在我的代码中Integer 64用作 an 的任何值应用属性类型。Int

另外,在某个地方,前段时间,我读到如果没有理由使用Integer 16or Integer 32,则默认使用Integer 64对象模型图中的 。(我假设Integer 16Integer 32保留是为了向后兼容。)如果我找到该参考资料,我将在此处链接它。

我可以在这里写下标量属性类型的使用,并通过在属性检查器中选择 Class Codegen = Manual/None 来手动编写您的托管对象子类,但老实说,我已经决定这样添加的细节只会使事情复杂化。

因此,您的“由 Core Data 自动生成”托管对象子类/es ( NSManagedObject) 将使用可选的NSNumber?包装器...

因此,您需要在代码中转换持久/保存的数据。

我在两个地方这样做......当我访问数据和持久化数据时。

(注意我假设您的实体是类型Dog并且存在dogie的实例let dog = Dog()

// access
tempGender = dog.gender as? Int

// save
dog.gender = tempGender as NSNumber?

在这两者之间,我使用类型的“临时”var属性Int来处理分段控件。

// temporary property to use with segmented control
private var tempGender: Int?

更新

我现在做的最后一部分有点不同......

我没有在代码中转换数据,而是对我的托管对象子类做了一个简单的扩展来执行转换。因此,我不再直接访问 Core Data 属性并在代码中操作数据,而是使用这个方便的 var。

extension Dog {
    var genderAsInt: Int {
        get {
            guard let gender = self.gender else { return 0 }
            return Int(truncating: gender)
        }
        set {
            self.gender = NSNumber(value: newValue)
        }
    }
} 

您的选择器代码...

Picker(selection: $addDogVM.genderAsInt, label: Text("Gender?")) {
    Text("Boy ♂").tag(0)
    Text("?").tag(1)
    Text("Girl ♀").tag(2)
}

有任何问题,请在评论中提问。

于 2019-10-20T01:06:45.140 回答