试图理解为什么在交换机更改时崩溃的原因

时间:2017-07-23 20:14:52

标签: ios swift

学习Swift 3 - 不知道为什么更改按钮背景颜色的代码会崩溃应用程序。 myButton是一个类变量,应该可以正常使用吗?

class ViewController: UIViewController {

    var myButton : UIButton!
    var mySwitch : UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstView = UIView()
        firstView.backgroundColor = UIColor.white
        view = firstView

        let myNewView = UIView( frame: CGRect(x:65, y:100, width:300, height:200))
        myNewView.backgroundColor = UIColor.blue
        //myNewView.layer.cornerRadius = 25
        //myNewView.layer.borderWidth = 2
        //myNewView.layer.borderColor = UIColor.red.cgColor
        self.view.addSubview(myNewView)



        let switchDemo=UISwitch();
        switchDemo.isOn = true
        switchDemo.setOn(true, animated: false);
        switchDemo.addTarget(self, action: #selector(ViewController.switchValueDidChange(sender:)), for: .valueChanged);


        let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 144, height: 144))
        myButton.backgroundColor = UIColor.red
        myButton.addTarget(self, action: #selector(ViewController.ratingButtonTapped(sender:)), for: .touchUpInside)
        self.view.addSubview(myButton)

        myButton.addSubview(switchDemo);

    }

    func switchValueDidChange( sender:UISwitch){
        print("Switch changed")
        myButton.backgroundColor = UIColor.green
    }

    func ratingButtonTapped(sender:UIButton!)
    {
        print("Button It Works!!!")
    }

}

3 个答案:

答案 0 :(得分:1)

首先,严格说出myButton实例变量(实际上是属性),而不是变量。

let myButton =创建一个与该属性同名的局部变量,但是同一个对象。

解决方案是省略let

myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 144, height: 144))

答案 1 :(得分:0)

您没有在代码中的任何位置实例化myButton,因此它会保留nil

是,但是,在myButton中声明了名为viewDidLoad本地变量。

您应该用以下内容替换您的实例:

myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 144, height: 144))

答案 2 :(得分:0)

很简单。您声明了一个类属性,但是您没有实例化它。我的viewDidLoad你只是实例化一个局部变量myButton,而不是实例化类属性。

这是一个修复:

myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 144, height: 144))

只需删除let关键字。