分段控件的每个元素都由一个类型的索引表示Int
,因此该索引从 开始0
。
因此,使用具有三个段的分段控件示例(例如:男孩 ♂、?、女孩 ♀),每个段由三个索引 0、1 和 2 表示。
如果用户选择代表 Girl ♀ 的分段控件,则...
segmentedControl.selectedSegmentIndex = 2
当使用 Core Data 框架存储一个值时,即在 UI 中表示为分段控制索引时,我总是以0
.
从现在开始,您阅读的所有内容都是程序员的偏好——也就是说,需要明确的是——有多种方法可以实现相同的结果,您应该选择最适合您和您的编码风格的一种。另请注意,这可能会让新手感到困惑,因此我鼓励您耐心等待。我唯一的建议是,在您经过测试、调试和测试足以理解差异之前,让事情尽可能简单。
所以继续:
苹果文档指出...
...在 64 位平台上,Int 与 Int64 大小相同。
因此,在 Core Data 模型编辑器(.xcdatamodeld
文件)中,我选择为将在我的代码中Integer 64
用作 an 的任何值应用属性类型。Int
另外,在某个地方,前段时间,我读到如果没有理由使用Integer 16
or Integer 32
,则默认使用Integer 64
对象模型图中的 。(我假设Integer 16
或Integer 32
保留是为了向后兼容。)如果我找到该参考资料,我将在此处链接它。
我可以在这里写下标量属性类型的使用,并通过在属性检查器中选择 Class Codegen = Manual/None 来手动编写您的托管对象子类,但老实说,我已经决定这样添加的细节只会使事情复杂化。
因此,您的“由 Core Data 自动生成”托管对象子类/es ( NSManagedObject
) 将使用可选的NSNumber?
包装器...
因此,您需要在代码中转换持久/保存的数据。
我在两个地方这样做......当我访问数据和持久化数据时。
(注意我假设您的实体是类型Dog
并且存在dog
ie的实例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)
}
有任何问题,请在评论中提问。