【问题标题】:motionEnded not being called (no view controller)未调用motionEnded(无视图控制器)
【发布时间】:2011-04-01 21:09:44
【问题描述】:

我想我已经尽我所能来检测震动,但 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。)

【问题讨论】:

    标签: iphone ipad ios shake motion


    【解决方案1】:

    在视图进入视图层次结构之前,您不能成为第一响应者。

    【讨论】:

    • 我也尝试在其他地方调用它,但它似乎没有帮助 - 就像在 drawView 中一样。
    • 你可以创建一个视图控制器来粘贴 EAGLView,并在 viewDidAppear: 中调用 becomeFirstResponder:?
    • 如果可以的话,我有点想避免这种情况。 UIViews 是 UIResponders,如果我没记错的话。
    【解决方案2】:

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

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • Joe D'Andrea 在stackoverflow.com/questions/150446/… 上提供更深入的回答
      • 您是否注意到您验证了 event.typeUIEventSubtypeMotionShake 的子类型?巧合的是,这有效,因为 UIEventSubtypeMotionShakeUIEventTypeMotion 具有相同的值。
      【解决方案4】:

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

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

      【讨论】:

      • 这是正确的做法。它对我有用。我遇到了问题,因为我的视图位于导航视图控制器中
      • 这以某种方式弄乱了 IBActions 的响应链
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2013-01-19
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多