motionEnded вызывается несколько раз - PullRequest
2 голосов
/ 10 октября 2009

У меня есть подкласс 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];
    } 
}

Вы ожидаете, что когда я нажму ^ + Cmd + Z в симуляторе iPhone, он будет только один раз регистрироваться, но он последовательно регистрируется дважды для каждого события. Ниже приведен результат трех симуляций «встряхивания»:

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.

Ответы [ 2 ]

3 голосов
/ 22 октября 2009

Вот то, что я обнаружил, для меня выглядит как ошибка сима:

  1. Ошибка (уведомление о двойном движении) происходит, когда целью является OS 3.1 и 3.1.0 на sim
  2. Проблема НЕ возникает, когда цель равна 3,0 на симе

Проблема НИКОГДА не возникает на реальном устройстве независимо от цели.

так что это должно быть ошибка сима. Когда у меня будет возможность, я отправлю сообщение об ошибке в яблоко с repro

1 голос
/ 10 октября 2009

Не видел этого, но вы можете попробовать это, не вызывая супер метод. Реализация по умолчанию motionEnded (из UIResponder) должна быть NOP, поэтому нет необходимости вызывать родительский метод.

Кроме того, вы пробовали это на самом устройстве? Это может быть проблема с симулятором.

...