以编程方式切换 UISwitch,阻止 IBAction 功能

programmatically toggle UISwitch, prevent IBAction function

我有一个 UISwitch,当它被切换时,IBAction 被触发:

@IBAction func mySwitchToggled( switch_: UISwitch ) {
        ...
}

因此,当用户切换开关时,将调​​用上述函数。

有时,我还需要以编程方式切换开关:

mySwitch.setOn(false, animated: false) //It triggers the IBAction function

以上代码触发了IBAction函数。

根据我的特殊要求,我需要在用户切换开关时触发 IBAction 函数,但是当以编程方式切换开关时,我不希望触发 IBAction 函数。

如何在不 触发 IBAction 函数的情况下以编程方式切换我的开关

请看下面,这里swcValueChangedValue Changed函数,只有当用户切换开关时才会调用。

@IBAction func swcValueChanged(_ sender: Any) {
    print("Switch value changed")
}

这里是按钮点击事件,上面的函数不会调用。

@IBAction func btnTapped(_ sender: Any) {
    swcTemp.setOn(!swcTemp.isOn, animated: true)
}

hmmm... intersting. It gets triggered in my project

我没有足够的代表发表评论,所以我 post 作为 PPL 的回答,他的回答,你检查过你的网点了吗?大多数情况下,情节提要与您的其他 IB 动作保持联系,从而导致它们同时触发。 (删除现有网点并实施价值变更,应该可行)

这是另一个(有点老套的)解决方案,通过代码调用开关时实现一个跳过布尔值:

var skip: Bool = false

@IBAction func mySwitchToggled( switch_: UISwitch ) {
    guard !skip else {
        skip = false
        return
    }
    // do stuff
}

func someFunc() {
    // called it like this
    skip = true
    mySwitch.setOn(false, animated: false)
}