大多数重载方法需要[super theMethod]
调用。
(例如,[super viewDidLoad];
,[super viewWillAppear];
和[super dealloc];
)
我没有想过我是否需要[super touchesBegan:withEvent:]
来电,但它似乎在某种程度上起作用。
我什么时候需要它?不我需要它吗?
我正在尝试以编程方式取消触摸事件,这似乎与我提出的问题有关。
答案 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中阅读相关内容。在许多情况下,如果超类实现的作用对于常见的预期行为至关重要,那么指南文档会给出调用超类实现的明确建议。