touchesBegan 在 uiresponder 的子类中被忽略

Posted

技术标签:

【中文标题】touchesBegan 在 uiresponder 的子类中被忽略【英文标题】:touchesBegan ignored in subclass of uiresponder 【发布时间】:2012-01-26 11:47:57 【问题描述】:

使用目标 c 并使用 xcode 开发 ios 应用程序。我有一个继承自另一个继承自 UIResponder 的类的类,它包含一个视图。我在子类中有一个 touchesBegan,但只有在调试/开发模式下运行应用程序时才会调用该事件。当我进行生产/发布构建时,不会调用触摸事件。

// Basic viewcontroller protocol
@protocol SubViewController
    - (void)viewDidAppear:(BOOL)animated;
    - (void)viewDidDisappear:(BOOL)animated;
    - (void)viewWillAppear:(BOOL)animated;
    - (void)viewWillDisappear:(BOOL)animated;
    - (void)viewDidLoad;
    -(UIView *)view;
@end


@interface SubViewController : UIResponder<SubViewController> 


/////////////////////////////////////////////////////////////////////////////////


// A custom subview controller
//

@interface mySubViewController : SubViewController 


在 mysubviewcontroller 类中我有

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
   //some code and magic

现在正如我所说,在调试中运行它很好,但在发布时会忽略触摸事件。请说任何有助于澄清这一点的提示、想法或问题。提前致谢

编辑:我在文档中看到了这一点“如果您在不调用 super(一种常用模式)的情况下覆盖此方法,您还必须覆盖处理触摸事件的其他方法,如果只是作为存根(empy)实现。”所以我在所有其他触摸事件中存根,但发布版本没有变化

【问题讨论】:

您没有继承UIViewController(已经继承自UIResponder)的任何特殊原因?我怀疑您的自定义 UIResponder 子类未正确添加到响应者链中。 hmm 我如何检查子类是否已添加到响应者链中?或者添加它的正确方法是什么?我确定没有子类化 uiviewcontroller 是有原因的,但我现在想不起来了,而且是很久以前写的。 参见UIViewController 文档中的第 3 段。基本上,您需要在您正在管理的视图和“视图控制器”中覆盖nextResponder。视图将返回视图控制器,视图控制器将返回视图的父视图。 试试这个,然后回复你。任何想法为什么它会在调试时工作? 干得好欢呼。那里发生了一些奇怪的事情。现在是响应者链的一部分。你想这样做作为答案,或者我可以接受它 【参考方案1】:

由于您没有继承 UIViewController(它会自动执行此操作),因此您需要手动将响应者添加到响应者链中。

UIViewController 在响应者链中的位置介于其视图和视图的父视图之间,因此要获得相同的行为,您需要在视图和管理它的控制器中覆盖 nextResponder。视图应该返回控制器,控制器应该返回视图的父视图。

【讨论】:

以上是关于touchesBegan 在 uiresponder 的子类中被忽略的主要内容,如果未能解决你的问题,请参考以下文章

UIResponder学习 手势

iOS事件机制(点击、手势、UIControl)

UIResponder 类和第一响应者角色

UIResponder 类中的触摸事件响应方法

iOS学习笔记之触摸事件&UIResponder

iOS 触摸事件与UIResponder(内容根据iOS编程编写)