长话短说(如果我做错了,请停止我):我想让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;
}
非正式协议不应该处理警告吗? 我做错了什么?
答案 0 :(得分:0)
您尚未声明协议,您已在NSObject上声明了一个类别。您可以在不影响编译器警告的情况下删除其定义。
由于你有一个子类,你就会被委托给它(这是一个id)。
要确定编译器警告,您应该能够简单地将其转换为id,如下所示:
id delegate =(id)[self delegate] if((delegate respondsToSelector:...]){...}