如何调用父类的协议函数?

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.