如何解决这个错误?在xcode中

时间:2017-10-30 15:35:20

标签: ios swift exc-bad-instruction

  

警告:线程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
    }
}

3 个答案:

答案 0 :(得分:0)

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

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

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

更新viewDidLoad以使用label属性而不是同名的区域设置变量。

换句话说,改变:

var label = UILabel()

为:

label = UILabel()

答案 1 :(得分:0)

应该有所帮助。在您的变量标签中为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
    }
}

答案 2 :(得分:0)

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

要修复它,您只需要替换

//Label
var label = UILabel()

通过

//Label
label = UILabel()

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