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 时,它只会记录一次,但它会始终为每个事件记录两次。以下是三个“摇晃”模拟的结果:

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 运动结束

有没有人看到这个,如果有,你是如何解决的?我正在使用 iPhone SDK 3.1 和 Xcode 版本 3.1.4。

4

2 回答 2

3

我在这里发现的东西,对我来说看起来像是一个 sim 错误:

  1. 当目标是 sim 上的 OS 3.1 和 3.1.0 时,会发生问题(双 motionEnded 通知)
  2. sim 上的目标为 3.0 时不会发生问题

无论目标如何,问题都不会在实际设备上发生。

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

于 2009-10-22T04:03:57.520 回答
1

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

另外,您是否在设备本身上尝试过这个?可能是模拟器问题。

于 2009-10-10T01:25:12.880 回答