как сохранить состояние переключателя?

#swift #userdefaults #dlradiobutton

#swift #ошибки пользователя #dlradiobutton

Вопрос:

я пытаюсь сохранить состояние моего переключателя, но у меня это не работает, есть идеи, как это сделать? для этого сейчас я использую userdefaults

 class WTSettingsVC: UIViewController {


    @IBOutlet weak var checkBttn: DLRadioButton!
    @IBOutlet weak var checkBttn2: DLRadioButton!
    var switchON : Bool = false
    var button : Bool = false
    let defaults = UserDefaults.standard
    override func viewDidLoad() {
        super.viewDidLoad()

        checkBttn.isSelected = UserDefaults.standard.bool(forKey: "issaved")
        checkBttn2.isSelected = UserDefaults.standard.bool(forKey: "issaved")

    }

    override func viewWillAppear(_ animated: Bool) {
        super .viewWillAppear(animated)
         self.setCommonNavigationBar(title: "Settings", largeTitle: true, tranpernt: false, tint: WTConstant.LMColors.greenTheme, fontColor: .white)
        checkBttn?.isEnabled =  UserDefaults.standard.bool(forKey: "switchState")
        checkBttn?.addTarget(self, action: #selector(bttnAction(_:)), for: .touchUpInside)
    }

    @IBAction func bttnAction(_ sender: DLRadioButton) {
        if sender.tag == 1  {
           sender.isEnabled = true
             switchON = true
             defaults.set(switchON, forKey: "switchON")


        }else if sender.tag == 2{
            sender.isEnabled = true
            switchON = false
            defaults.set(switchON, forKey: "switchON")


                }
            }
        }

        UserDefaults.standard.set(sender.isEnabled, forKey: "switchState")
        UserDefaults.standard.synchronize()

    }

}
  

Комментарии:

1. Для UserDefaults используются 3 разных ключа, причем не последовательно. И вы пытаетесь использовать одну и ту же клавишу для двух разных кнопок. И не используйте synchronize() , оно устарело.

2. Почему вы используете один и тот же ключ для сохранения состояния двух разных кнопок?

3. я просто новичок в этом, поэтому не могли бы вы, пожалуйста, рассказать мне, как это сделать. я буду благодарен за вашу помощь

Ответ №1:

Не используйте один и тот же ключ для сохранения состояния двух кнопок. И используйте тот же ключ для сохранения и извлечения состояния кнопки.

 class WTSettingsVC: UIViewController {

    @IBOutlet weak var checkBttn: DLRadioButton!
    @IBOutlet weak var checkBttn2: DLRadioButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        checkBttn.isSelected = UserDefaults.standard.bool(forKey: "checkBttnSelected")
        checkBttn2.isSelected = UserDefaults.standard.bool(forKey: "checkBttn2Selected")
        checkBttn.addTarget(self, action: #selector(bttnAction(_:)), for: .touchUpInside)
        checkBttn2.addTarget(self, action: #selector(bttnAction(_:)), for: .touchUpInside)
    }

    @IBAction func bttnAction(_ sender: DLRadioButton) {
        if sender == checkBttn  {
            UserDefaults.standard.set(true, forKey: "checkBttnSelected")
            UserDefaults.standard.set(false, forKey: "checkBttn2Selected")
        }else if sender == checkBttn2 {
            UserDefaults.standard.set(false, forKey: "checkBttnSelected")
            UserDefaults.standard.set(true, forKey: "checkBttn2Selected")
        }
    }
}
  

Ответ №2:

Кажется, что ваш код довольно явно неправильно вложен. Например, следующий код фактически не выполняется в функции bttnAction:

 UserDefaults.standard.set(sender.isEnabled, forKey: "switchState")
UserDefaults.standard.synchronize()
  

Этот код необходимо поместить в фигурную скобку над ним. Попробуйте переписать свой код аналогично этому:

 class WTSettingsVC: UIViewController {


    @IBOutlet weak var checkBttn: DLRadioButton!
    @IBOutlet weak var checkBttn2: DLRadioButton!
    var switchON : Bool = false
    var button : Bool = false
    let defaults = UserDefaults.standard
    override func viewDidLoad() {
        super.viewDidLoad()

        checkBttn.isSelected = UserDefaults.standard.bool(forKey: "issaved")
        checkBttn2.isSelected = UserDefaults.standard.bool(forKey: "issaved")

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.setCommonNavigationBar(title: "Settings", largeTitle: true, tranpernt: false, tint: WTConstant.LMColors.greenTheme, fontColor: .white)
        checkBttn?.isEnabled =  UserDefaults.standard.bool(forKey: "switchState")
        checkBttn?.addTarget(self, action: #selector(bttnAction(_:)), for: .touchUpInside)
    }

    @IBAction func bttnAction(_ sender: DLRadioButton) {
        if sender.tag == 1 {
            sender.isEnabled = true
            switchON = true
            defaults.set(switchON, forKey: "switchON")


        } else if sender.tag == 2 {
            sender.isEnabled = true
            switchON = false
            defaults.set(switchON, forKey: "switchON")
        }
        UserDefaults.standard.set(sender.isEnabled, forKey: "switchState")
        UserDefaults.standard.synchronize()
    }
}
  

Поскольку эти строки кода находились за пределами закрывающей скобки для этой функции, строки фактически не были включены ни в одну функцию и, таким образом, никогда не были бы вызваны.