iOS 设置页面助手类

问题描述

我正在尝试构建一个设置页面助手类,以简化设置页面的设置。

这个想法是该类处理将状态保存到 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!)
    }
}