1
长话短说(请阻止我,如果我这样做是错误的):我想有一个NSTextView接受自定义的拖动类型,并在收到这样的拖动更改内容匹配。
为此,我使用NSTextView子类来实现自定义拖拽类型,并且(从子类)完成时向NSTextView委托发送消息。这只是正常,但我得到一个熟悉的编译器警告(虽然一切正常):NSTextView子类中的自定义委托方法 - 编译器警告
法“-dragReceivedWithTrack:”未找到(返回类型默认为“身份证”)
一些代码:
@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;
}
不应该使用非正式协议来处理警告吗?
我在做什么错?
一个类别,特别是在'NSObject'上声明的类别,被称为非正式协议。 – 2011-04-06 04:10:27
当然,你可以这样滥用类别(甚至在Apple的文档中也是如此),但是你应该真的声明你的协议使用@protocol/@optional如果这真的是你想要做的 在NSObject上添加一个类别对这个特殊的代码没有特别的意义,重要的部分是respondsToSelector: – Philippe 2011-04-07 03:50:11