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

时间:2019-06-01 00:55:00

标签: ios swift core-data uisegmentedcontrol

我有十二个细分控件。我将每个索引的选定索引保存在Core Data中。我的实体称为工作表,每个索引都保存为一个Int。这部分效果很好。

问题是我想在其他视图中显示所选标题。但是我显然不能仅仅从Core Data中获取索引。我的新观点不知道这些数字代表什么。我知道CoreData无法保存元组,但这会使事情变得简单得多。

我曾尝试创建一个可转换的属性和一个自定义的托管对象,但是第一个不适用于元组,而第二个似乎也无法解决。标题和索引似乎不应该分开。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用CaseIterable为每个SegmentedControls创建一个枚举

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: $1, at: $0, 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