在Swift 3中的UserDefaults中记录UISwitch状态的最佳方法是什么

时间:2016-11-02 13:54:08

标签: ios swift

我的(未来)应用中有一个设置视图,带有4个UISwitch。我想使用UserDefaults类来记录开关状态。

我创建了一个带有4个属性(键)的结构“SettingsKey”来保存每个开关状态:

struct SettingsKeys {
  static let appShowContactsPhoto = "app.showContactsPhoto"
  static let appShowAge = "app.showAge"
  static let widgetShowContactsPhoto = "widget.showContactsPhoto"
  static let widgetShowAge = "widget.showAge"
}

要加载数据,我使用4“UserDefaults.standard.bool(forKey:key)”作为“viewDidLoad”方法中SettingsKeys中的4个属性。

保存数据的最佳方法是什么?我不想在我的视图控制器中创建4个动作(每个切换一个“valueChanged”动作),所以我只创建了一个。但是如何使用righ“SettingsKey”属性映射每个UISwitch?我想要一个通用代码(一条指令?),我不希望我的代码是这样的:

if sender = switch1 then record data with this key
else if sender = switch2 then record data with this key
else if ...

也许使用UIView标签?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情

@IBAction func changeSettings(_ sender: UISwitch) {

    switch sender.tag {
    case 1:
        // Change for switch1

        break
    case 2:
        // Change for switch2

        break
    case 3:
        // Change for switch3, etc
        break

    default:
        print("Unknown Switch")
        return
    }

}

您可以设置标记(唯一编号以识别您的视图/切换)。

每个开关的

在上面的示例中,它们分别为1,2 3 )。

答案 1 :(得分:0)

我使用了Wolverine提出的UIView.tag属性:

  • 1st UISwitch.tag = 0
  • 2nd UISwitch.tag = 1
  • ...

然后我修改了我的结构:

struct SettingsKeys {
  // Application Settings
  static let appShowContactsPhoto = "app.showContactsPhoto"
  static let appShowAge = "app.showAge"

  // Widget Settings
  static let widgetShowContactsPhoto = "widget.showContactsPhoto"
  static let widgetShowAge = "widget.showAge"

  // All settings
  static let serialized = [
    0: appShowContactsPhoto,
    1: appShowAge,
    10: widgetShowContactsPhoto,
    11: widgetShowAge,
  ]
}

我的行动:

// Click on a switch button
@IBAction func changeSetting(_ sender: UISwitch) {
  UserDefaults.standard.set(sender.isOn, SettingsKeys.serialized[sender.tag]!)
}

一切正常!