如何调用父类的协议函数?
How to call superclass's protocol function?
在我的 UITableViewController subclass 中,我覆盖了 scrollViewDidScroll。我也想调用父 class 的 scrollViewDidSroll,以防它需要 运行 一些东西。这样做时出现无法识别的选择器错误。如果我检查它是否响应选择器,这怎么可能?
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ([super respondsToSelector:@selector(scrollViewDidScroll:)]) {
// unrecognized selector
[super scrollViewDidScroll:scrollView];
}
// My child class's specific stuff
}
您无法通过使用 super
关键字向对象发送 respondsToSelector:
来测试对象是否从其 superclass 继承方法。此方法仍将测试整个对象,而不仅仅是 superclass 的实现。因此,发送respondsToSelector:
到super
相当于发送给自己。相反,您必须直接在对象的 superclass 上调用 NSObject
class 方法 instancesRespondToSelector:
,如以下代码片段所示。
if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
// invoke the inherited method
[super aMethod];
}
您不能简单地使用 [[self superclass] instancesRespondToSelector:@selector(aMethod)]
,因为如果它被子class调用,这可能会导致该方法失败。
请注意,如果接收方能够将 aSelector
消息转发给另一个对象,它将能够响应该消息,尽管是间接的,即使此方法 returns NO
.
在我的 UITableViewController subclass 中,我覆盖了 scrollViewDidScroll。我也想调用父 class 的 scrollViewDidSroll,以防它需要 运行 一些东西。这样做时出现无法识别的选择器错误。如果我检查它是否响应选择器,这怎么可能?
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ([super respondsToSelector:@selector(scrollViewDidScroll:)]) {
// unrecognized selector
[super scrollViewDidScroll:scrollView];
}
// My child class's specific stuff
}
您无法通过使用 super
关键字向对象发送 respondsToSelector:
来测试对象是否从其 superclass 继承方法。此方法仍将测试整个对象,而不仅仅是 superclass 的实现。因此,发送respondsToSelector:
到super
相当于发送给自己。相反,您必须直接在对象的 superclass 上调用 NSObject
class 方法 instancesRespondToSelector:
,如以下代码片段所示。
if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
// invoke the inherited method
[super aMethod];
}
您不能简单地使用 [[self superclass] instancesRespondToSelector:@selector(aMethod)]
,因为如果它被子class调用,这可能会导致该方法失败。
请注意,如果接收方能够将 aSelector
消息转发给另一个对象,它将能够响应该消息,尽管是间接的,即使此方法 returns NO
.