這似乎是一件簡單的事情,但我的大腦今天似乎沒有工作,我的搜索沒有找到有用的答案。如何在類別中擴展Cocoa協議以避免「在協議中找不到」警告?
我有很多通過類別擴展可可類的代碼(它也是open source)。有些方法想要調用委託;舊的代碼中使用的非正式協議,要做到這一點,但現在建設目標10.6的時候,我得到警告:
warning: '-outlineView:menuForTableColumn:byItem:' not found in protocol(s)
舉個例子,這裏有一個類別:
@interface NSOutlineView (DSOutlineViewCategories)
- (NSMenu *)menuForEvent:(NSEvent *)event;
@end
其中使用的非正式協議聲明一個委託方法:
@interface NSObject (DSTableViewDelegate)
- (NSMenu *)outlineView:(NSOutlineView *)olv menuForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
@end
和實現調用的委託:
@implementation NSOutlineView (DSOutlineViewCategories)
- (NSMenu *)menuForEvent:(NSEvent *)event
{
NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
NSInteger column = [self columnAtPoint:point];
NSInteger row = [self rowAtPoint:point];
id item = [self itemAtRow:row];
if (column >= 0 && item && [[self delegate] respondsToSelector:@selector(outlineView:menuForTableColumn:byItem:)])
return [[self delegate] outlineView:self menuForTableColumn:[[self tableColumns] objectAtIndex:column] byItem:item];
else
return [super menuForEvent:event];
}
@end
我該如何更新此代碼10.6(及更高版本),以避免「在協議中找不到」警告?
非常感謝。這確實解決了它。我曾考慮過創建一個這樣的協議,但是避開了使用演員陣容;通常是一面紅旗。但在這種情況下完全合適。 – Dejal 2011-06-04 05:05:29