如何从Cocoa中的子类委托方法调用超类委托方法?

时间:2014-09-22 04:15:00

标签: objective-c cocoa delegates nsoutlineview

有示例类:

@interface OutlineViewController : NSOutlineView <NSOutlineViewDataSource, NSOutlineViewDelegate>
@end

@implementation OutlineViewController
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    NSTableCellView *result = nil;
if (myCondition)
{
// ...
    return result;
} else {
// how return defult?
}
}

@end

是否有可能从委托方法调用默认实现?

1 个答案:

答案 0 :(得分:1)

只需使用super关键字引用您在评论中所做的父类:

if (myCondition) {
    //...your implementation here
}
else {
    return [super outlineView:outlineview heightOfRowByItem:item];
}

对于加分,您可以使用-respondsToSelector:检查super是否对相关方法做出响应。

更新:我刚才注意到这种情况下的超类本身就是NSOutlineView。这是非常令人困惑的 - 视图和视图控制器是不同的东西,所以从视图中调用一些“视图控制器”并不是一个好的计划。另请注意,文档建议"Subclassing NSOutlineView is not recommended."

尽管如此,我认为我现在更好地理解你的问题 - 我认为通过“默认实现”你的意思不是委托方法的继承版本,而是如果委托方法不是大纲视图将使用的行为实施完毕。在这种情况下,答案很简单:你可以简单地做NSOutlineView本身会做的事情。 -outlineView:heightOfRowByItem:的文档说:

  

实现此方法以支持具有不同行高的大纲视图。

另一方面,对于固定的行高,NSOutlineView几乎肯定会使用它从rowHeight继承的NSTableView属性。因此,当您不想更改行高时,可以在这些情况下返回rowHeight

if (myCondition) {
    //...your implementation here
}
else {
    return outlineView.rowHeight;
}