我刚刚注意到设置 UISwitchisOn
在其 IBAction 中会导致再次调用 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
, and 1 pre: false
叫做
- 开关以编程方式打开
-
1 post: true
被打印
为什么系统会第二次调用IBAction?例如,当想要根据某种内部状态否定用户的操作时,如何解决这个问题?我觉得我错过了一些令人尴尬的明显的东西,但我很确定类似的代码曾经可以工作。这是 iOS 的错误吗?它在 iOS 10.2 iPhone 5s 模拟器、Xcode 版本 8.2.1 (8C1002) 上运行
有趣的是,当按钮绑定到buttonTapped
被点击(调用相同的方法),不会调用交换机的 IBAction。
您的 IBAction 可能已连接到valueChanged
,这并不表示特定的触摸事件,只是确切地说,值已更改。
我建议设置一个名为类似的变量var didOverrideSwitchValue = false
,将其设置为true
在设置新的开关值之前,然后在调用该函数时,检查该变量。如果设置为true
,然后将其设置为false
并返回。
或者,如果您希望仅在打开时取消新设置,那么您可以这样做if (switch.isOn)
,然后如果是这样,您可以根据需要通过将其关闭来响应它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)