3

我想我已经做了所有我应该检测到震动的事情,但motionEnded:withEvent:从来没有被叫过。(一个问题是我没有UIViewController- 我的应用程序基于“OpenGL ES App”模板。)

我已添加application.applicationSupportsShakeToEdit = YES;到我的application:didFinishLaunchingWithOptions:, 和

- (BOOL)canBecomeFirstResponder { return YES; }

到 EAGLView.m(确实会被调用)和[self becomeFirstResponder];initWithCoder:(并且也尝试过其他各种地方)。

但是调试器从来没有命中

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 

我错过了一些步骤吗?我必须有一个控制器吗?

(我在 iPad 模拟器中使用 iOS 3.2。)

4

4 回答 4

4

您必须将其添加到您的控制器:

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

-(BOOL)becomeFirstResponder
{
    return YES;
}
于 2013-09-20T19:12:20.943 回答
3

UIResponder链与震动通知的工作方式令人讨厌。似乎UIWindow总是收到通知,然后子响应者可能会或可能不会取决于链中它们上方的内容。我创建了一个UIWindow子类,并将其定义为我的窗口类,如下所示:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{
    if (event.type == UIEventSubtypeMotionShake) 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"UIEventSubtypeMotionShakeEnded" object:nil];
}

然后,对于任何需要震动通知的视图,我只是让他们将自己添加为UIEventSubtypeMotionShakeEnded事件的观察者,他们每次都得到它。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeNotification:)
                                             name:@"UIEventSubtypeMotionShakeEnded" object:nil];
于 2011-04-03T23:12:08.280 回答
0

在您的视图位于视图层次结构中之前,您不能成为第一响应者。

于 2010-08-21T00:12:42.670 回答
0

更新到最新版本的 SDK 神奇地解决了这个问题。[耸肩]

于 2010-08-24T21:40:52.197 回答