motionEnded被多次调用

时间:2009-10-10 01:09:19

标签: iphone cocoa-touch uikit motion

我有一个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它只会记录一次,但它会为每个事件一直记录两次。以下是三次“震动”模拟的结果:

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 个答案:

答案 0 :(得分:3)

我发现的内容对我来说看起来像是一个sim bug:

  1. 当目标是OS 3.1和3.1.0 on sim
  2. 时发生问题(双动议程通知)
  3. 问题当目标在sim上为3.0时不会发生
  4. 无论目标如何,问题都不会发生在实际设备上。

    所以这必须是一个sim bug。 当我有机会将我作为一个错误提交给苹果w / repro

答案 1 :(得分:1)

没有看到这个,但你可能想在不调用super方法的情况下尝试它。 motionEnded(来自UIResponder)的默认实现应该是NOP,因此不需要调用父方法。

另外,你在设备上试过这个吗?这可能是一个模拟器问题。