1

我正在尝试以编程方式创建一个 UISwitch(没有 IBOutlets 或 IBActions),但我似乎无法弄清楚如何让开关在按下时改变状态。我以为 ...

mySwitch.addTarget() 

... 每次打开/关闭开关时都会调用它,但情况似乎并非如此。有人可以解释我做错了什么以及如何纠正这个问题。

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
4

2 回答 2

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. 虽然返回类型为switchChangedis Void,但您的代码与编写代码几乎相同Selector()

尽量使用#selector符号。在这种情况下,使用上面介绍的类,您可以将其编写为#selector(MyTarget.switchChanged).

因此,要addTarget正确地,您需要将行更改为:

let target = MyTarget()
mySwitch.addTarget(target, action: #selector(MyTarget.switchChanged), forControlEvents: .ValueChanged)

我的 Xcode 有点顽固,我需要重新启动 Xcode 才能查看实时视图时间线,但是,通过这些更改,我相信您的代码可以按预期工作。

于 2016-07-20T17:35:13.463 回答
0
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged)

但它不是包含switchChanged功能的标签:它是

在实际的应用程序项目(即不是游乐场)中正确配置它会更好。您将拥有一个可以充当self目标并且可以成为目标的视图控制器。

于 2016-07-20T17:03:00.377 回答