【问题标题】:Setting and Saving UISwitch Value Error设置和保存 UISwitch 值错误
【发布时间】:2017-08-29 11:20:01
【问题描述】:

我的问题是,一旦您离开设置页面,我在设置页面中的 UISwitch 就会一直恢复到关闭状态,这意味着无法正确使用该开关。我做了一些搜索,发现了这个问题和答案: How do i keep UISwitch state when changing ViewControllers?

我阅读了这个页面并将答案添加到我的代码中:

@IBOutlet weak var NumSwitch: UISwitch!

override func viewDidLoad() {
    super.viewDidLoad()
    NumSwitch.isOn = UserDefaults.standard.bool(forKey: "switchState")
    // Do any additional setup after loading the view, typically from a nib.
}


@IBAction func SaveSwitchPressed(_ sender: UISwitch) {
    UserDefaults.standard.set(sender.isOn, forKey: "switchState")
}

但是,当我运行此代码时,我得到:

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0)

(突出显示该行:'NumSwitch.isOn = UserDefaults.standard.bool(forKey: "switchState")')

[我使用的是 Xcode 8.2.1]

我已将两个 UIViewController 连接到一个 ViewController 类,所以这可能是导致问题的原因。我尝试了许多其他方法来使我的开关正常工作,而这个似乎对其他人有用。有什么明显的我做错了吗?

[我本来希望将其添加为对上述问题的评论,但我没有这样做的声誉]

【问题讨论】:

  • 检查 NumSwitch 是否为零?
  • 你好@Mike Alter,我应该怎么做?我对 swift 和 xcode 比较陌生
  • 验证print(NumSwitch)不是nil
  • 所以我应该创建一个 UI 标签?
  • 不,检查您的NumSwitch 不是nil

标签: swift xcode uiswitch


【解决方案1】:

如果一切都正确连接到您的插座,那么以下应该可以工作:

@IBOutlet weak var NumSwitch: UISwitch!

override func viewDidLoad() {
    super.viewDidLoad()
    let isOn = UserDefaults.standard.bool(forKey: "switchState")

    // If the below statement prints `nil` this is what's causing the crash
    print(NumSwitch)

    NumSwitch.setOn(isOn, animated: false)
}


@IBAction func SaveSwitchPressed(_ sender: UISwitch) {
    UserDefaults.standard.set(sender.isOn, forKey: "switchState")
}

错误Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0) 通常意味着您试图强制解开可选值。唯一可能导致代码中出现这种情况的是NumSwitchnil

我还建议不要用大写字母命名您的属性,因为这可能会产生误导。大写名称通常用于表示声明的类型/类/结构等。

【讨论】:

  • 感谢您的回答,但是,当我使用您的代码 override let isOn = UserDefaults.standard.bool(forKey: "switchState") NumSwitch.setOn(isOn, animated: false) 时,我仍然收到 Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0) 错误,只是这次突出显示了 NumSwitch.setOn(isOn, animated: false)
  • 您的NumSwitch 插座似乎没有正确连接,您是否使用辅助编辑器通过情节提要创建了插座?
  • 我不完全确定您所说的辅助编辑器是什么意思,但我可以告诉您我是如何连接我的开关的。我控制在情节提要中单击它,然后将蓝线连接到我的 ViewController.swift 文件。
  • 是的,这是正确的做法。不过,似乎出了点问题,如果 NumSwitch 是 == nil 那么您将遇到崩溃并看到您遇到的错误。尝试删除@IBOutlet weak var NumSwitch: UISwitch! 行并重新添加,看看是否有帮助。此外,当对话框出现时,将存储设置为strong 而不是weakweak 出口有时可以从内存中释放,这也可能导致它成为 nil
  • 我这次重新连接了@IBOutlet weak var NumSwitch: UISwitch!,按照您的建议将其更改为@IBOutlet var NumSwitch: UISwitch!,但是当我运行程序时仍然出现错误
猜你喜欢
  • 2013-01-12
  • 2012-02-26
  • 2012-06-02
  • 2011-10-03
  • 2016-10-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多