如何在核心数据中保存分段控件的索引和标题

how to save the index and title of a segmented control in core data

我有十几个分段控件。我在核心数据中为每个索引保存了选定的索引。我的实体称为 Worksheet,每个索引都保存为 Int。那部分效果很好。

问题是我想在不同的视图中显示所选的标题。但是我显然不能只从 Core Data 中获取索引。我的新观点不知道这些数字代表什么。不过,我知道 CoreData 不能保存元组,这会让事情变得容易得多。

我已经尝试创建一个可转换属性和一个自定义托管 object,但第一个不适用于元组,我似乎无法理解第二个。标题和索引好像不应该分开。

将标题放入某种数据模型中。您不想将标题存储在 Core Data 中。这使得本地化您的应用程序变得非常困难。使用您的数据模型将索引转换为字符串,以便在分段控件和其他视图上显示。

通过这种方式,您的数据模型可以为您的应用支持的任何语言(现在或将来)加载一组字符串,并且索引可以 return 使用正确语言的正确字符串。您的应用程序中的任意数量的视图都可以使用该数据模型。

使用 CaseIterable

为每个 SegmentedControl 创建一个枚举
enum Planet: String, CustomStringConvertible, CaseIterable {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
    var description: String {
        return self.rawValue.capitalized
    }
}

并使用Planet.allCases数组为分段控件创建分段

let segmentedControl = UISegmentedControl(items: Planet.allCases)

Planet.allCases.enumerated().forEach {
    segmentedControl.insertSegment(withTitle: , at: [=12=], animated: true)
}

当在段控件中更改选择时,将所选索引保存在核心数据中。

@objc func indexChanged(_ sender: UISegmentedControl) {
    print(Planet.allCases[sender.selectedSegmentIndex])
    //save sender.selectedSegmentIndex in core data
}

当你想在不同的视图中显示选定的标题时,从核心数据中获取选定的索引。并从Enum.allCases数组

中获取对应的字符串值
let selectedPlanetIndex = 5//Index fetched from core data
let selectedPlanetTitle = Planet.allCases[selectedPlanetIndex]//saturn