问题描述
这个想法是该类处理将状态保存到 UserDefaults 并设置任何 UISwitch 的初始状态。
设置开关只需将新开关设置为“UISettingsSwitch”类并将其名称添加到可访问性标签(据我所知,这是唯一可用的标识符)。
到目前为止我有:
import Foundation
import UIKit
class SettingsUISwitch: UISwitch {
enum SettingsType {
case darkMode,sound
}
func ison(type: SettingsType ) -> Bool {
switch type {
case .darkMode:
return userDefaults.bool(forKey: "darkMode")
case .sound:
return userDefaults.bool(forKey: "sound")
}
}
let userDefaults = UserDefaults.standard
override init(frame: CGRect) {
super.init(frame: frame)
initSwitch()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initSwitch()
}
deinit {
}
func initSwitch() {
addTarget(self,action: #selector(toggle),for: .valueChanged)
}
@objc func toggle(){
userDefaults.setValue(self.isOn,forKey: self.accessibilityLabel!)
}
}
我知道的并不多。
我目前可以做到:
if settingsSwitch.ison(type: .darkMode) {
print (settingsSwitch.ison(type: .darkMode))
print ("ON")
} else {
print ("OFF")
}
init 设置中似乎在任何时候都没有可访问性标签,因此似乎不可能设置初始状态。 是否可以通过这种方式设置 UISwitch 的初始状态?
理想情况下,我想将 :settingsSwitch.darkMode.ison 公开为布尔值......但我无法弄清楚。感谢您的帮助
解决方法
我设法使用恢复标识符来设置交换机,但我仍然希望删除案例和对 userDefaults 的重复调用
import Foundation
import UIKit
class UISwitchSettings: UISwitch {
enum SettingsType: String,CaseIterable {
case darkMode = "darkMode"
case sound = "sound"
}
func ison(type: SettingsType ) -> Bool {
switch type {
case .darkMode:
return userDefaults.bool(forKey: "darkMode")
case .sound:
return userDefaults.bool(forKey: "sound")
}
}
let userDefaults = UserDefaults.standard
override init(frame: CGRect) {
super.init(frame: frame)
initSwitch()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initSwitch()
}
deinit {
}
func initSwitch() {
if let key = self.restorationIdentifier {
// Logic needs changing if default switch is off
if userDefaults.bool(forKey: key) || userDefaults.object(forKey: key) == nil {
self.isOn = true
} else {
self.isOn = false
}
}
addTarget(self,action: #selector(toggle),for: .valueChanged)
}
@objc func toggle(){
userDefaults.setValue(self.isOn,forKey: self.restorationIdentifier!)
}
}