gpt4 book ai didi

ios - 从 IBAction 以编程方式设置 UISwitch isOn 再次调用 IBAction

转载 作者:可可西里 更新时间:2023-11-01 06:13:22 27 4
gpt4 key购买 nike

我刚刚注意到在其 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
  1. 开关在 viewDidLoad 中关闭
  2. 开关由用户打开
  3. 当调用 switchChanged (IBAction) 时开关现在打开
  4. 0 pre: true 被打印
  5. 开关在 switchChanged 中以编程方式关闭
  6. 0 post: false 被打印
  7. switchChanged 被系统再次调用
  8. 开关现在在 switchChanged 中关闭,并且 1 pre: false 被调用
  9. 开关以编程方式打开
  10. 1 post: true 被打印

为什么IBAction会被系统第二次调用?例如,当想要根据某些内部状态否定用户的操作时,如何解决这个问题?我觉得我遗漏了一些非常明显的东西,但我很确定曾经使用过类似的代码。这是iOS错误吗?它在 iOS 10.2 iPhone 5s 模拟器、Xcode 版本 8.2.1 (8C1002) 上运行

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

最佳答案

您的 IBAction 可能连接到 valueChanged,这并不表示特定的触摸事件,只是它所说的那样,值已更改。

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

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

关于ios - 从 IBAction 以编程方式设置 UISwitch isOn 再次调用 IBAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com