userDefualt не сохраняет переключатель, когда класс segued - PullRequest
0 голосов
/ 15 марта 2020

Мой быстрый код ниже, который является кодом без раскадровки. Пытается сохранить состояние коммутатора, используя пользовательские настройки по умолчанию. Поэтому, когда пользователь переходит к twoViewController, а затем переходит обратно к ViewController. Настройка переключения пользователей не сохраняется. Там нет ошибок, и я не знаю, что происходит.

import UIKit

class ViewController: UIViewController {
    var nxtBTn = UIButton()
    var mySwitch =  UISwitch()

    let userDefaults = UserDefaults.standard

    var firstTimeAppLaunch: Bool {
        get {
            // Will return false when the key is not set.
            return userDefaults.bool(forKey: "firstTimeAppLaunch")
        }
        set {}
    }



    @objc func switchAction(_ sender: UISwitch) {
        userDefaults.set(sender.isOn, forKey: "mySwitchValue")
    }
   @objc func press() {
        let segue = twoViewController()

        segue.modalPresentationStyle = .fullScreen // actually .fullScreen would be better
        self.present(segue, animated: true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        [nxtBTn,mySwitch].forEach {
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)
            $0.backgroundColor = .green

        }
        if !firstTimeAppLaunch {
            // This will only be trigger first time the application is launched.
            userDefaults.set(true, forKey: "firstTimeAppLaunch")
            userDefaults.set(true, forKey: "mySwitchValue")
        }

        NSLayoutConstraint.activate([

            nxtBTn.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            nxtBTn.topAnchor.constraint(equalTo: view.topAnchor),
            nxtBTn.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 7/7, constant: 0),
            nxtBTn.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.4, constant: 0),

            mySwitch.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            mySwitch.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            mySwitch.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 7/7, constant: 0),
            mySwitch.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.4, constant: 0),

        ])
        mySwitch.addTarget(self, action: #selector(switchAction(_:)), for: .touchDown)
             nxtBTn.addTarget(self, action: #selector(press), for: .touchDown)

        view.backgroundColor = .white
    }

    override func viewDidAppear(_ animated: Bool) {

                mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
    }

}
class twoViewController : UIViewController{

    var backBtn = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()
        backBtn.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(backBtn)
        backBtn.backgroundColor = .systemGreen


        NSLayoutConstraint.activate([

            backBtn.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            backBtn.topAnchor.constraint(equalTo: view.topAnchor),
            backBtn.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 7/7, constant: 0),
            backBtn.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.4, constant: 0),


        ])

        backBtn.addTarget(self, action: #selector(oneVC), for: .touchDown)


    }

    @objc func oneVC(){
        let segue = ViewController()

        segue.modalPresentationStyle = .fullScreen // actually .fullScreen would be better
        self.present(segue, animated: true)
    }
}

1 Ответ

3 голосов
/ 15 марта 2020

Везде, где вы говорите for: .touchDown, это неправильно. Измените их все на for: .primaryActionTriggered, и все улучшится.

...