我有一个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
本身作为参数的指针,因此在创建事件时无法获取其值。只能检索当前值,该值可能已经更改。