2

ビューがアップしたときにシェイクイベントを処理しようとしている UIViewController サブクラスがあります。

私が実装した関連するメソッドは次のとおりです。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (void)viewDidDisappear:(BOOL)animated {
    [self resignFirstResponder];
    [super viewDidDisappear:animated];
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (motion == UIEventTypeMotion && event.type == UIEventSubtypeMotionShake) {
        NSLog(@"%@ motionEnded", [NSDate date]);
    }

    if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) {
        [super motionEnded:motion withEvent:event];
    } 
}

iPhone シミュレーターで ^+Cmd+Z を押すと、ログが 1 回しか記録されないことが予想されますが、イベントごとに一貫して 2 回ログが記録されます。以下は、3 つの「シェイク」シミュレーションの結果です。

2009-10-09 20:52:06.216 TestApp[39802:20b] 2009-10-09 20:52:06 -0400 motionEnded
2009-10-09 20:52:06.218 TestApp[39802:20b] 2009-10-09 20:52:06 -0400 motionEnded
2009-10-09 20:52:07.689 TestApp[39802:20b] 2009-10-09 20:52:07 -0400 motionEnded
2009-10-09 20:52:07.690 TestApp[39802 :20b] 2009-10-09 20:52:07 -0400 motionEnded
2009-10-09 20:52:08.001 TestApp[39802:20b] 2009-10-09 20:52:08 -0400 motionEnded
2009-10-09 20:52:08.002 TestApp[39802:20b] 2009-10-09 20:52:08 -0400 motionEnded

誰かがこれを見たことがありますか? もしそうなら、どのように修正しましたか? iPhone SDK 3.1 と Xcode バージョン 3.1.4 を使用しています。

4

2 に答える 2

3

ここで私が発見したものは、私にはシムのバグのように見えます:

  1. ターゲットが sim の OS 3.1 および 3.1.0 の場合に問題 (motionEnded 通知が 2 回) が発生する
  2. SIM のターゲットが 3.0 の場合、問題は発生しません

ターゲットに関係なく、実際のデバイスで問題が発生することはありません。

したがって、これはシムのバグに違いありません。機会があれば、Apple w/repro にバグとして提出します

于 2009-10-22T04:03:57.520 に答える
1

これは見ていませんが、スーパー メソッドを呼び出さずに試してみることをお勧めします。motionEnded(UIResponder からの)のデフォルトの実装はNOP であると想定されているため、親メソッドを呼び出す必要はありません。

また、デバイス自体でこれを試しましたか?シミュレーターの問題かもしれません。

于 2009-10-10T01:25:12.880 に答える