Как решить эту ошибку? в 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()