如何调用超类的协议功能?

时间:2015-08-21 19:45:28

标签: objective-c uitableview cocoa-touch protocols

在我的UITableViewController子类中,我覆盖了scrollViewDidScroll。我想调用父类的scrollViewDidSroll,以防它需要运行一些东西。这样做时我得到一个无法识别的选择器错误。如果我检查它是否响应选择器,那怎么可能呢?

#pragma mark - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  if ([super respondsToSelector:@selector(scrollViewDidScroll:)]) {
    // unrecognized selector
    [super scrollViewDidScroll:scrollView];
  }
  // My child class's specific stuff
}

1 个答案:

答案 0 :(得分:1)

通过使用respondsToSelector:关键字将super发送到对象,您无法测试对象是否从其超类继承方法。这个方法仍然会测试整个对象,而不仅仅是超类的实现。因此,将respondsToSelector:发送到super相当于将其发送给自己。相反,您必须直接在对象的超类上调用NSObject类方法instancesRespondToSelector:,如下面的代码片段所示。

if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
    // invoke the inherited method
    [super aMethod];
}

您不能简单地使用[[self superclass] instancesRespondToSelector:@selector(aMethod)],因为如果子类调用该方法可能会导致该方法失败。

请注意,如果接收者能够将aSelector个消息转发给另一个对象,它将能够响应该消息,尽管是间接的,即使此方法返回NO