无法从其他视图控制器Swift获取值

时间:2018-05-30 23:14:22

标签: ios swift uiviewcontroller

我想从此视图控制器获取用户设置详细信息,并将这些详细信息读取到上一个视图控制器。我尝试了很多不同的方法,但在访问此视图控制器之前我无法获取值

我在此页Pass Data Tutorial

尝试了第一种方法

此方法也无效。我认为这很简单,但我无法找到正确的方法。

class SetConvViewController: UIViewController {

    var engS = "engS"

    @IBOutlet weak var swithEnglish: UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let eng2 = defaults.value(forKey: engS)
        {
            swithEnglish.isOn = eng2 as! Bool
        }

    }

    let defaults = UserDefaults.standard

    @IBAction func switchEng(_ sender: UISwitch) {
        defaults.set(sender.isOn, forKey: engS)

    }
}

3 个答案:

答案 0 :(得分:1)

如果我从这一部分正确地理解你 - “但是在我访问这个视图控制器之前我无法获取值” - 你的问题在于,在你访问你的设置之前,{{1}没有任何价值。 }}。 如果您使用UserDefaults方法阅读它们,我建议您切换到使用getObject(forKey:),因为它将返回getBool(forKey:),即使尚未为该键设置该值( docs

无论如何,如果你想设置一些默认/初始值,你可以在false中的didFinishLaunching方法中设置:

AppDelegate

我在你的代码中也注意到你使用了if UserDefaults.standard.object(forKey: „engS”) == nil { // the value has not been set yet, assign a default value } - 你不应该在value(forKey:)上这样做 - 这是一个很好的答案,为什么 - What is the difference between object(forKey:) and value(forKey:) in UserDefaults?

另外,如果您是第一次使用iOS SDK中的类,我强烈建议您查看其文档 - 它们写得很好,并且会为您提供有关可能性的一般理解。

答案 1 :(得分:0)

我建议您将这种数据存储为某个对象中的静态字段,以便能够从任何地方读取它。 e.g。

class AppController{
    static var userDefaults = UserDefaults.standard
}

然后你可以将它保存在SetConvViewController中,如

@IBAction func switchEng(_ sender: UISwitch) {
    AppController.userDefaults.set(sender.isOn, forKey: engS)
}

然后你可以通过调用

从任何其他视图控制器中读取它
AppController.userDefaults

答案 2 :(得分:0)

使用segues,您可以设置为任何目的地,无论是下一个vc还是上一个:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "PreviousVC" {
            if let prevVC = segue.destination as? PreviousViewController {

                //Your previous vc should have your storage variable.
                prevVC.value = self.value

            }
    }

如果您要呈现视图控制器:

目的地vc:

//If using storyboard...
let destVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DestinationViewController") as! DestinationViewController

destVC.value = self.value
self.present(destVC, animated: true, completion: nil)

上一个vc:

weak var prevVC = self.presentingViewController as? PreviousViewController

if let prevVC = prevVC {

    prevVC.value = self.value
}