UISwitch难道不应该反着来吗?

3

我对我的代码为什么与我最初想象的相反感到困惑。以下是我的代码当前的功能:

//MARK: Actions
@IBAction func SwitchTap(sender: UISwitch) {
    if mySwitch.on {                           //prints on if turning on
        mySwitch.setOn(true, animated: true)
        print ("switch is on")
    }
    else {
        mySwitch.setOn(false, animated: true)
        print("switch is off")              //prints off if turning off
    }

这是我认为应该的工作方式:
//MARK: Actions
@IBAction func SwitchTap(sender: UISwitch) {
    if mySwitch.on {
        mySwitch.setOn(**false**, animated: true) // should be false instead of true like in the previous example
        print ("switch is on")
    }
    else {
        mySwitch.setOn(**true**, animated: true) //should be true instead of false like in the previous example
        print("switch is off")
    }

我不明白为什么第一个版本能够工作,而第二个版本却不能。 SetOn 应该在第一个参数传递 false 时将开关关闭。但是当传递 true 时,它实际上关闭了开关,并且没有改变状态。


你的 SwitchTap 函数是绑定在你添加到 UISwitch 上的轻拍手势上,还是绑定在“ValueChanged”控件事件上?如果是后者,你真的应该将函数重命名为更少令人困惑的名称。 - rmaddy
1个回答

3
请注意,UISwitch 会在用户点击后切换其值。
您的 SwitchTap 与开关内部切换其值同时被调用。您的第一个代码保留了相同的状态,因此当开关切换时,最终结果是一个切换。然而,您的第二个代码翻转了状态,因此当 `UISwitch' 切换时,开关将保持在其原始状态,因为两个切换会相互抵消。
删除所有对 setOn 的调用将修复您的代码。

我不知道!非常感谢。 - Jacob
不,SwitchTap在切换开关状态后被调用。假设开关处于关闭状态并且用户点击它。开关将自己设置为打开并调用SwitchTap。然后,SwitchTap(在Jacob的第二个版本中)将状态设置回关闭(false)。因此,点击开关没有任何效果(“根本不会改变状态”)。 - rob mayoff
@robmayoff 你是对的,反转先进行的顺序无关紧要,可以是代码先执行,也可以是开关先执行。我编辑了答案,删除了提到 OP 的代码优先于开关执行的部分。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接