4

我有一个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]

  1. 将更改从 切换OffOn
  2. 事件“值改变”被放入队列
  3. 将更改从 切换OnOff
  4. [- handleSwitch:]响应“值已更改”事件消息而调用。但是,由于开关已经变回Off状态,它无法检测到开关处于On发送事件之前的状态。
  5. 没有第二次调用[- handleSwitch]. 不知何故,这两个“价值改变”事件合并为一个。

这导致了以下问题:

  • 此案一般如何处理?真的有必要UISwitch手动处理从 ' 状态到相同状态的转换吗?

  • 该框架足够智能,可以将两个开关转换组合成一个事件。On为什么在这些情况下检测=>OnOff=>Off情况并从队列中删除事件还不够智能?

  • 是否有可能在功能期间开关值发生变化[- handleSwitch]?或者是在 GUI 线程上调用的函数,因此在运行时阻塞了用户界面?

    如果在方法中值可能发生变化,那么如何应对呢?由于该方法仅获取指向UISwitch自身的指针作为参数,因此无法在事件创建时获取其值。只能检索当前值,该值可能已经更改。

4

0 回答 0