学习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!!!")
}
}
答案 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
关键字。