motionEnded未被调用(没有视图控制器)

3
我认为我已经尽力检测摇晃了,但是motionEnded:withEvent:从未被调用。(一个问题是我没有一个UIViewController - 我的应用程序基于“OpenGL ES App”模板。)
我已经在我的application:didFinishLaunchingWithOptions:中添加了application.applicationSupportsShakeToEdit = YES;
- (BOOL)canBecomeFirstResponder { return YES; }

将文本从英语翻译为中文:
[self becomeFirstResponder];添加到initWithCoder:(还尝试过其他一些地方),并将

EAGLView.m(确实得到调用)传递给它们

。但是调试器从未命中过。
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 

我错过了什么步骤吗?我必须要有一个控制器吗?
(我正在iPad模拟器中使用iOS 3.2。)
4个回答

4

您必须在控制器中添加以下内容:

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

-(BOOL)becomeFirstResponder
{
    return YES;
}

这是正确的做法。它对我起作用了。我遇到了一个问题,因为我的视图在导航视图控制器中。 - Markicevic
这会在某种程度上破坏IBActions的响应链。 - Hogdotmac

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];

更深入的答案可以在https://dev59.com/AnVC5IYBdhLWcg3w51lv上找到,作者是Joe D'Andrea。 - LolaRun
你注意到了吗?你将 event.type 与子类型 UIEventSubtypeMotionShake 进行了验证?巧合的是,这起作用是因为 UIEventSubtypeMotionShakeUIEventTypeMotion 具有相同的值。 - bio

0

在视图层次结构中,您的视图尚未显示之前,无法成为第一响应者。


我也尝试在其他地方调用它,但似乎没有帮助 - 比如在“drawView”中。 - Grumdrig
你能创建一个视图控制器来固定EAGLView,并在viewDidAppear中调用becomeFirstResponder吗? - tc.
如果可能的话,我有点想避免那个。如果我没记错的话,UIViewUIResponder - Grumdrig

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接