ios - 如何从另一个 ViewController 检索 UseDefault 保存的数据

标签 ios swift

我有 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/

相关文章:

ios - FaSTLane 版本上传 - 我们暂时无法保存您的更改。请稍后再试

ios - 在应用商店提交应用时本地通知不起作用

ios - Xcode 7 beta 2 上的 "no such module"

ios - Objective C - 按值传递和按引用传递

ios - UICollectionView 中仅某些单元格之间的自定义间距

iphone - 来自字符串数组 iPhone 的子字符串

ios - 从 Firebase 接收多个重复推送通知

swift - 方法不会覆盖 Swift3 中其父类(super class)的任何方法?

ios - 后台位置跟踪不适用于物理设备 swift

ios - 将 accessToken 存储在 iOS 钥匙串(keychain)中