(iphone)[super touchesBegan / Moved / Ended]做什么?

时间:2011-02-11 16:51:17

标签: iphone touch super

大多数重载方法需要[super theMethod]调用。

(例如,[super viewDidLoad];[super viewWillAppear];[super dealloc];

我没有想过我是否需要[super touchesBegan:withEvent:]来电,但它似乎在某种程度上起作用。

我什么时候需要它?我需要它吗?

我正在尝试以编程方式取消触摸事件,这似乎与我提出的问题有关。

1 个答案:

答案 0 :(得分:18)

虽然这一切都取决于对象的预期行为,但让我们指出基本的:如果你想要超类实现的默认行为,你可以在重写方法中调用超类实现(你的意思是覆盖,而不是重载)。 p>

所以你应该问的问题是:

1)超类实现的作用是什么?

2)我的对象是否需要它?

那么你的超类的touchesBegan:withEvent:等呢?这取决于您的类层次结构。类层次结构中的自定义类可能已经覆盖了这些方法,您可能想要这些行为。我假设没有自定义类已经覆盖了这些方法,所以你必须只检查Cocoa实现。

touchesBegan:withEvent:首先在UIResponder类中定义。我们来看UIResponder documentation,其中说

  

此方法的默认实现不执行任何操作。但是,UIResponder的UIKit子类,特别是UIView,会立即将消息转发给响应者链。

所以你在这里得到一个理论。如果你的类直接继承自UIResponder,你根本不需要调用超类实现,因为它无论如何都不会执行任何操作。如果它继承自其他UIKit子类(如UIView),则调用超类实现将启用在响应程序链中转发消息。但是,覆盖touchesBegan:withEvent:可能意味着您的子类本身想要处理触摸事件,因此您不希望将事件转发到响应者链。所以,我想你不想在这里调用超类实现。

这实际上取决于具体情况。比如说,您是UIScrollView的子类,并实现了touches...方法之一。如果您仍希望视图在用户拖动时滚动,那么您希望调用超类实现,因为它将为您处理滚动。

总而言之,您必须能够回答上述两个问题才能做出决定。要了解超类实现的功能,请在the Apple Documentation中阅读相关内容。在许多情况下,如果超类实现的作用对于常见的预期行为至关重要,那么指南文档会给出调用超类实现的明确建议。