【问题标题】:How to solve this error? in xcode如何解决这个错误?在 xcode 中
【发布时间】:2017-10-30 15:35:20
【问题描述】:

警告:线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

import UIKit

class ViewController: UIViewController {
    var count = 0
    var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Label
        var label = UILabel()
        label.frame = CGRect(x: 150, y: 150, width: 60, height: 60)
        label.text = "0"
        self.view.addSubview(label)

        //Button
        var button = UIButton()
        button.frame = CGRect(x: 150, y: 250, width: 60, height: 60)
        button.setTitle("Click", for: .normal)
        button.setTitleColor(UIColor.blue, for: .normal)
        self.view.addSubview(button)
        button.addTarget(self, action: #selector(ViewController.incrementCount), for: UIControlEvents.touchUpInside)
    }

    @objc func incrementCount() {
        self.count = self.count + 1
        self.label.text = "\(self.count)" //here got the warning
    }
}

【问题讨论】:

  • self.label 为零吗?您没有在viewDidLoad 中设置它,因为您在其中重新声明label,所以它只是创建另一个标签而不是写入第一个标签。从var label = UILabel() 中的viewDidLoad 中删除var,你应该会很好。

标签: ios swift exc-bad-instruction


【解决方案1】:

导致该错误的一个常见原因是尝试强制解包 nil 可选。

您的问题是尝试访问 self.label,这是一个隐式展开的可选选项。它崩溃是因为self.labelnil

它是nil,因为在viewDidLoad 中,您实际上并没有为label 属性赋值。相反,您使用同名的局部变量。

更新您的viewDidLoad 以使用label 属性而不是同名的语言环境变量。

换句话说,改变:

var label = UILabel()

到:

label = UILabel()

【讨论】:

    【解决方案2】:

    应该有帮助。在您的变量标签中为 nil,因为您正在 viewDidLoad 中创建新变量

    import UIKit
    
    class ViewController: UIViewController {
        var count = 0
        var label: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //Label
            label = UILabel()
            label.frame = CGRect(x: 150, y: 150, width: 60, height: 60)
            label.text = "0"
            self.view.addSubview(label)
    
            //Button
            var button = UIButton()
            button.frame = CGRect(x: 150, y: 250, width: 60, height: 60)
            button.setTitle("Click", for: .normal)
            button.setTitleColor(UIColor.blue, for: .normal)
            self.view.addSubview(button)
            button.addTarget(self, action: #selector(ViewController.incrementCount), for: UIControlEvents.touchUpInside)
        }
    
        @objc func incrementCount() {
            self.count = self.count + 1
            self.label.text = "\(self.count)" //here got the warning
        }
    }
    

    【讨论】:

      【解决方案3】:

      viewDidLoad() 方法中,您正在创建一个名为“label”的新变量。我认为这是一个错误,您也想设置名为“label”的类变量。

      要修复它,您只需更换

      //Label
      var label = UILabel()
      

      //Label
      label = UILabel()
      

      当您尝试在incrementCount 方法中访问“label”变量时,该变量不会为 nil,您的应用也不会崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多