Как решить эту ошибку? в xcode

предупреждение: поток 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 ответа

Это должно помочь. В вашей переменной метка была ноль, потому что вы создаете новую переменную внутри 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
    }
}

В viewDidLoad() метод, вы создаете новую переменную с именем "label". Я думаю, что это ошибка, и вы хотели бы также установить переменную класса с именем "label".

Чтобы это исправить, вам нужно только заменить

//Label
var label = UILabel()

от

//Label
label = UILabel()

Когда вы попытаетесь получить доступ к переменной "label" в incrementCount метод, переменная не будет ноль, и ваше приложение не будет падать.

Распространенной причиной этой ошибки является попытка принудительно развернуть ноль необязательно.

Ваша проблема пытается получить доступ self.label который является неявно развернутым необязательным. Это сбой, потому что self.label является nil,

это nil потому что в viewDidLoad вы на самом деле не присваиваете значение вашему label имущество. Вместо этого вы используете локальную переменную с тем же именем.

Обновите свой viewDidLoad использовать label свойство вместо языковой переменной с тем же именем.

Другими словами, измените:

var label = UILabel()

чтобы:

label = UILabel()
Другие вопросы по тегам