4

UISwitch対応するイベントがUIControlEventValueChangedfunction にバインドされた があります[- 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. Offからへの変更を切り替えるOn
  2. イベント「値が変更されました」がキューに入れられます
  3. Onからへの変更を切り替えるOff
  4. [- handleSwitch:]"value changed" イベント メッセージに応答して呼び出されます。ただし、スイッチはすでに状態に戻っているため、イベントが送信されたときにOffスイッチが前の状態にあったことを検出できません。On
  5. の 2 回目の呼び出しはありません[- handleSwitch]。どういうわけか、2 つの「値の変更」イベントが 1 つに結合されました。

これは、次の質問につながります。

  • このケースは一般的にどのように処理されますか? UISwitchの状態から同じ状態への遷移を手動で処理する必要は本当にありますか?

  • このフレームワークは、2 つのスイッチ遷移を 1 つのイベントに結合するのに十分なほどインテリジェントです。On=>OnOff=>Offのケースを検出し、これらのケースでキューからイベントを削除するのに十分なほどインテリジェントではないのはなぜですか?

  • 関数の途中でスイッチの値が変わる可能性はあり[- handleSwitch]ますか? または、関数が GUI スレッドで呼び出されるため、実行中にユーザー インターフェイスがブロックされますか?

    メソッド内で値が変化する可能性がある場合、どのように対処できますか? メソッドは引数として自分自身へのポインタを取得するだけなのでUISwitch、イベント作成時にその値を取得することはできません。すでに変更されている可能性がある現在の値のみを取得できます。

4

0 に答える 0