我正在尝试以编程方式创建一个UISwitch(没有IBOutlets或IBActions),我似乎无法弄清楚如何在按下时让开关改变状态。我以为......
mySwitch.addTarget()
每次开关切换为On / Off时都会调用...但似乎并非如此。有人可以解释一下我做错了什么,以及如何纠正这个问题。
import UIKit
import XCPlayground
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 568 * 0.75))
view.backgroundColor = UIColor.whiteColor()
view.layer.borderColor = UIColor.grayColor().CGColor
view.layer.borderWidth = 1
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 50))
label.text = "Label"
label.textAlignment = NSTextAlignment.Center
view.addSubview(label)
func switchChanged(sender: UISwitch!) {
if sender.on == true {
label.text = "Switch is ON"
} else if sender.on == false {
label.text = "Switch is OFF"
}
}
let mySwitch = UISwitch()
mySwitch.center = view.center
mySwitch.setOn(true, animated: false)
mySwitch.onTintColor = UIColor.redColor()
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged)
view.addSubview(mySwitch)
XCPlaygroundPage.currentPage.liveView = view
答案 0 :(得分:1)
您需要对此行进行一些修复:
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged)
要使addTarget
起作用,您需要一个响应操作的实例。显然label
不会回复switchChanged
。
将您的操作方法包含在类中:
class MyTarget {
@objc func switchChanged(sender: UISwitch!) {
if sender.on == true {
label.text = "Switch is ON"
} else if sender.on == false {
label.text = "Switch is OFF"
}
}
}
另一个问题是使用Selector.init
,如果你写Selector(switchChanged(mySwitch))
,Swift执行参数switchChanged(mySwitch)
,然后将结果传递给Selector.init
。
虽然switchChanged
的返回类型为Void
,但您的代码与撰写Selector()
几乎相同。
尽量使用#selector
表示法。在这种情况下,使用上面介绍的类,您可以将其写为#selector(MyTarget.switchChanged)
。
因此,要addTarget
正确,您需要将行更改为:
let target = MyTarget()
mySwitch.addTarget(target, action: #selector(MyTarget.switchChanged), forControlEvents: .ValueChanged)
我的Xcode有点顽固,我需要重新启动Xcode才能看到实时视图时间轴,但是,通过这些更改,我相信您的代码可以正常运行。
答案 1 :(得分:0)
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged)
但它不是包含switchChanged
功能的标签:它是你。
在实际的应用项目(即不是游乐场)中,您可以更好地配置此功能。您将拥有一个可以充当self
的视图控制器,并且可以成为目标。