我有一个UISwitch
与其对应的UIControlEventValueChanged
事件绑定到一个函数[- handleSwitch:]
。
视图控制器
- (IBAction)handleSwitch:(UISwitch *)sender
{
static BOOL oldState;
if (sender.on && !oldState) {
NSLog(@"off => on");
} else if (oldState && !sender.on) {
NSLog(@"on => off");
} else if (oldState && sender.on) {
NSLog(@"Big bug source: on => on");
} else {
NSLog(@"Big bug source: off => off");
}
oldState = sender.on;
}
当我每隔几秒钟按下一次开关时,程序运行良好。但是,一旦我开始向交换机发送垃圾邮件,我就会开始获得“大错误源”。
在调用函数之前,它似乎sender.on
再次更改为其旧值。[- handleSwitch]
- 将更改从 切换
Off
到On
- 事件“值改变”被放入队列
- 将更改从 切换
On
到Off
[- handleSwitch:]
响应“值已更改”事件消息而调用。但是,由于开关已经变回Off
状态,它无法检测到开关处于On
发送事件之前的状态。- 没有第二次调用
[- handleSwitch]
. 不知何故,这两个“价值改变”事件合并为一个。
这导致了以下问题:
此案一般如何处理?真的有必要
UISwitch
手动处理从 ' 状态到相同状态的转换吗?该框架足够智能,可以将两个开关转换组合成一个事件。
On
为什么在这些情况下检测=>On
和Off
=>Off
情况并从队列中删除事件还不够智能?是否有可能在功能期间开关值发生变化
[- handleSwitch]
?或者是在 GUI 线程上调用的函数,因此在运行时阻塞了用户界面?如果在方法中值可能发生变化,那么如何应对呢?由于该方法仅获取指向
UISwitch
自身的指针作为参数,因此无法在事件创建时获取其值。只能检索当前值,该值可能已经更改。