ios – 设置UISwitch是以编程方式从IBAction再次调用IBAction

前端之家收集整理的这篇文章主要介绍了ios – 设置UISwitch是以编程方式从IBAction再次调用IBAction前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是注意到在其IBAction中设置UISwitch的isOn会导致再次调用IBAction.所以下面的代码

class ViewController: UIViewController {
    var count = 0
    @IBOutlet weak var mySwitch: UISwitch!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        mySwitch.isOn = false
    }

    @IBAction func buttonTapped(_ sender: UIButton) {
        mySwitch.isOn = !mySwitch.isOn
    }

    @IBAction func switchChanged(_ sender: UISwitch) {
        print("\(count) pre: \(mySwitch.isOn)")
        mySwitch.isOn = !mySwitch.isOn
        print("\(count) post: \(mySwitch.isOn)")
        count += 1
    }
}

打开开关一次时打印以下内容

0 pre: true
0 post: false
1 pre: false
1 post: true

>在viewDidLoad中关闭开关
>用户打开开关
>当调用switchChanged(IBAction)时,开关打开
> 0 pre:打印为true
> switchChanged中以编程方式关闭开关
> 0 post:false打印
>系统再次调用switchChanged
>现在在switchChanged中关闭开关,并调用1 pre:false
>以编程方式打开开关
> 1帖子:真印刷

为什么系统第二次调用IBAction?例如,当想要根据某些内部状态否定用户的行为时,如何解决这个问题呢?我觉得我错过了一些令人尴尬的东西,但我很确定类似的代码曾经工作过.这是iOS错误吗?它运行在iOS 10.2 iPhone 5s模拟器上,Xcode Version 8.2.1(8C1002)

有趣的是,当点击与buttonTapped绑定的按钮(调用相同的方法)时,不会调用开关的IBAction.

解决方法

您的IBAction可能与valueChanged挂钩,这并不表示特定的触摸事件,正如它所说的那样,值已被更改.

我建议设置一个名为var didOverrideSwitchValue = false的变量,在设置新的switch值之前将其设置为true,然后在调用函数时,检查该变量.如果设置为true,则将其设置为false并返回.

或者,如果您希望仅在打开时取消新设置,那么您可以执行if(switch.isOn),然后如果是,那么您可以通过关闭它来响应它,如果需要的话.

猜你在找的iOS相关文章