
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: true0 post: false1 pre: false1 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 – 设置UISwitch是以编程方式从IBAction再次调用IBAction全部内容,希望文章能够帮你解决ios – 设置UISwitch是以编程方式从IBAction再次调用IBAction所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)