我只是注意到在其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)