非 View 类可以成为 FirstResponder 吗?

Posted

技术标签:

【中文标题】非 View 类可以成为 FirstResponder 吗?【英文标题】:Can non View class become a FirstResponder? 【发布时间】:2014-04-15 10:09:59 【问题描述】:

我有一个自定义类 (MyEventHandler),它与我的应用程序中的 UI 无关。我希望它能够捕捉到 MotionShake 事件。据我了解,我需要让 MyEventHandler 成为第一响应者。

这就是我所做的。 我从UIResponder继承了MyEventHandler并实现了canBecomeFirstResponder方法。但是,当我调用becomeFirstResponder 时,它返回 0,[self isFirstResponder] 也是如此。

我检查了当前的第一响应者,结果是nil

如果我用我的 ViewController 做同样的事情,它可以正常工作,所以我的问题是:是否有可能创建一个不从 UIView 继承的自定义类,作为第一响应者?

这是我的代码:

@interface MyEventHandler : UIResponder
  - (void)start;
@end

@implementation MyEventHandler
- (void)start 
      [self becomeFirstResponder];
  

- (BOOL)canBecomeFirstResponder 
      return YES;
  
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
      if (motion == UIEventSubtypeMotionShake) 
          NSLog(@"Shake-shake-shake!");
      
  

@end

【问题讨论】:

【参考方案1】:

如果您对不在视图层次结构中的 View 对象调用 becomeFirstResponder,它将返回 nil。

出于您的目的,当您在 ViewController 上收到运动事件时,您可以使用通知告诉您的自定义类 (MyEventHandler)

【讨论】:

我正在尝试构建一个可以嵌入到任何应用程序中的框架,因此我无法修改应用程序的 ViewControllers。至于becomeFirstResponder,我在MyEventHandler 类中调用它,而不是在视图中。而MyEventHandler 只继承自UIResponder @oranJess 我现在正在做这件事,你明白了吗?

以上是关于非 View 类可以成为 FirstResponder 吗?的主要内容,如果未能解决你的问题,请参考以下文章

静态和非静态类[关闭]

MFC 中的非动态 Doc/View 架构使用

php 非对称加密解密类

Android界面架构(Activity,PhoneWiondow,DecorView)简介

设计模式-基本概念及UML图

mfc 时钟 OnTimer 非静态成员函数的非法调用