Swift - 当切换On / Off时UISwitch不更新

时间:2016-07-20 17:00:10

标签: ios swift cocoa-touch uiswitch addtarget

我正在尝试以编程方式创建一个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

2 个答案:

答案 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的视图控制器,并且可以成为目标。