NSTextView子类中的自定义委托方法 - 编译器警告

时间:2011-04-03 09:28:33

标签: cocoa

长话短说(如果我做错了,请停止我):我想让NSTextView接受自定义拖动类型,并在收到这样的拖动后更改要匹配的内容。
为此,我将NSTextView子类化为实现自定义拖动类型,并且(从子类)完成后向NSTextView委托发送消息。这很好用,但我得到一个熟悉的编译器警告(尽管一切正常):

  

方法'-dragReceivedWithTrack:'找不到(返回类型默认为'id')

一些代码:

@interface LyricTextView : NSTextView {
}

@end

@interface NSObject (CustomDragging)
-(BOOL)dragReceivedWithTrack:(NSDictionary *)track;
@end


@implementation LyricTextView
-(BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSData *data = [[sender draggingPasteboard] dataForType:kMyType];
    NSDictionary *track = [NSKeyedUnarchiver unarchiveObjectWithData:data];

    if ([[self delegate] respondsToSelector:@selector(dragReceivedWithTrack:)]) {
        return ([[self delegate] dragReceivedWithTrack:track]); // gives a warning, but works
    }

    return NO;
}

非正式协议不应该处理警告吗? 我做错了什么?

1 个答案:

答案 0 :(得分:0)

您尚未声明协议,您已在NSObject上声明了一个类别。您可以在不影响编译器警告的情况下删除其定义。

由于你有一个子类,你就会被委托给它(这是一个id)。

要确定编译器警告,您应该能够简单地将其转换为id,如下所示:

id delegate =(id)[self delegate] if((delegate respondsToSelector:...]){...}