我有 2 个 ViewController,一个显示 UI,第二个显示用作设置按钮的分段控件。我使用以下代码来保存分段控件状态:
UserDefaults.standard.set(selectorLabel.selectedSegmentIndex, forKey: "stateSelected")
然后我在 viewdidload 方法上检索该 usedefault:
if let value = UserDefaults.standard.value(forKey: "stateSelected"){
let selectedIndex = value as! Int
selectorLabel.selectedSegmentIndex = selectedIndex
}
到目前为止,这是按预期工作的,分段控制的状态在每次应用加载时都正确加载。
分段控件有两个文本标题 - 一个是“LBs & INs”,第二个是“KGs & CMs”。
我如何将这两个分段的控件文本标题保存为 UserDefaults,然后在第一个 ViewController 上调用它们以在 viewdidload 上设置两个标签?
最佳答案
定义一个模型来表示您要存储和恢复的数据:
struct SegmentedControlState: Codable {
let selectedIndex: Int
let titles: [String]
}
初始化模型,编码并将其存储在某处(如用户默认):
func saveState(of segmentedControl: UISegmentedControl) {
let state = SegmentedControlState(
selectedIndex: segmentedControl.selectedSegmentIndex,
titles: (0..<segmentedControl.numberOfSegments).map { segmentedControl.titleForSegment(at: $0) ?? ""})
let plist = try! PropertyListEncoder().encode(state)
UserDefaults.standard.set(plist, forKey: "SegmentedControlState")
//UserDefaults.standard.synchronize() //if targeting older iOS
}
为了恢复,你应该像这样颠倒顺序:
func loadState(on segmentedControl: UISegmentedControl) {
guard let plist = UserDefaults.standard.value(forKey: "SegmentedControlState") as? Data else { return }
let state = try! PropertyListDecoder().decode(SegmentedControlState.self, from: plist)
for element in state.titles.enumerated() {
segmentedControl.setTitle(element.element, forSegmentAt: element.offset)
}
segmentedControl.selectedSegmentIndex = state.selectedIndex
}
用法:
// store `selectorLabel` data
saveState(of: selectorLabel)
// restore `selectorLabel` data
loadState(on: selectorLabel)
请注意将这样的数据存储到userdefaults
根本不是一个好主意。如果您想从代码中的任何地方访问一些数据,您应该遵循单例模式并定义您自己的单例实例而不是标准的 userdefault。
关于ios - 如何从另一个 ViewController 检索 UseDefault 保存的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56637125/