#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()
}
}
Поскольку эти строки кода находились за пределами закрывающей скобки для этой функции, строки фактически не были включены ни в одну функцию и, таким образом, никогда не были бы вызваны.