先来看一张 Bug 截图:
我想你大概知道发生了什么。右侧的 UISwitch 按钮绑定了一个ValueDidChanged
事件用于开启和关闭【隐私保护功能】。当你点击按钮或者快速滑动按钮时,这个事件只会触发一次。然而坑点在于,如果是慢慢滑动滑块,当达到一个临界点,绑定的事件会在一瞬间触发 N 次。手指还没来得及离开屏幕继续滑动而发生细微偏移,绑定的事件会在这个时间片中被触发 N 次
所以,你必须想办法保证该事件只会被触发一次。我暂时想到两种方式去解决这个问题:
- 事件第一次被触发后,这时手指还在屏幕上,暂时禁用 UISwitch 的触摸事件,使其触摸失效。
- 设置一个 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");
}