先來看一張 Bug 截圖:
1.gif
我想你大概知道發(fā)生了什么。右側(cè)的 UISwitch 按鈕綁定了一個(gè)ValueDidChanged
事件用于開啟和關(guān)閉【隱私保護(hù)功能】。當(dāng)你點(diǎn)擊按鈕或者快速滑動(dòng)按鈕時(shí),這個(gè)事件只會觸發(fā)一次。然而坑點(diǎn)在于,如果是慢慢滑動(dòng)滑塊,當(dāng)達(dá)到一個(gè)臨界點(diǎn),綁定的事件會在一瞬間觸發(fā) N 次。手指還沒來得及離開屏幕繼續(xù)滑動(dòng)而發(fā)生細(xì)微偏移,綁定的事件會在這個(gè)時(shí)間片中被觸發(fā) N 次
2.gif
所以,你必須想辦法保證該事件只會被觸發(fā)一次。我暫時(shí)想到兩種方式去解決這個(gè)問題:
- 事件第一次被觸發(fā)后,這時(shí)手指還在屏幕上,暫時(shí)禁用 UISwitch 的觸摸事件,使其觸摸失效。
- 設(shè)置一個(gè) Flag, 避免多次調(diào)用。
顯然,第一種方法我還無處下手,如果你知道該怎么做,share it to us??。第二種方法可能會讓你的代碼中又多出一個(gè)臨時(shí)的全局變量或者靜態(tài)局部變量,但是請不要輕易使用它們,全局變量會增加代碼耦合度,而靜態(tài)局部變量會導(dǎo)致不可預(yù)估的后果。我有一個(gè)更好的辦法去設(shè)置 Flag 標(biāo)志:
- (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");
}