UISwitch 的隐患

先来看一张 Bug 截图:


1.gif

我想你大概知道发生了什么。右侧的 UISwitch 按钮绑定了一个ValueDidChanged事件用于开启和关闭【隐私保护功能】。当你点击按钮或者快速滑动按钮时,这个事件只会触发一次。然而坑点在于,如果是慢慢滑动滑块,当达到一个临界点,绑定的事件会在一瞬间触发 N 次。手指还没来得及离开屏幕继续滑动而发生细微偏移,绑定的事件会在这个时间片中被触发 N 次

2.gif

所以,你必须想办法保证该事件只会被触发一次。我暂时想到两种方式去解决这个问题:

  1. 事件第一次被触发后,这时手指还在屏幕上,暂时禁用 UISwitch 的触摸事件,使其触摸失效。
  2. 设置一个 Flag, 避免多次调用。

显然,第一种方法我还无处下手,如果你知道该怎么做,share it to us😃。第二种方法可能会让你的代码中又多出一个临时的全局变量或者静态局部变量,但是请不要轻易使用它们,全局变量会增加代码耦合度,而静态局部变量会导致不可预估的后果。我有一个更好的办法去设置 Flag 标志:

- (IBAction)test:(UISwitch *)sender
{
    if ([objc_getAssociatedObject(sender, "onReally") isEqualToValue:@(sender.isOn)]) return;
    objc_setAssociatedObject(sender, "onReally", @(sender.isOn), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    NSLog(@"%s -> %@", __func__, sender.isOn ? @"ON" : @"OFF");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,710评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 我听从你的建议 不再爱你 于是开始为难自己
    孤鸟差鱼阅读 133评论 0 1
  • 喜欢娇花的女孩啊! 在这梦中, 你还在等待吗? 等待来年的娇花。 不如, 看看远方寒风中, 一种叫做梅花的, 美丽...
    圆凣阅读 205评论 0 1
  • 胖子打电话过来,问下午什么时候上瑜伽课,我告知了她,并嘱咐她早点过来,炖了排骨汤给她吃。 炖汤不假...
    天青81阅读 297评论 0 0