在我的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
}
答案 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
。