2011-04-03 17 views
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; 
} 

不应该使用非正式协议来处理警告吗?
我在做什么错?

回答

0

您还没有声明协议,您已经在NSObject上声明了一个类别。您可能可以删除其定义而不会影响编译器警告。

既然你有一个子类,你坚持使用委托(它是一个id)。

要奎尔奇的编译器警告,你应该能够简单地将其转换为ID,像这样:

ID委托=(ID)自委托] IF((委托respondsToSelector:...]) {...}

+0

一个类别,特别是在'NSObject'上声明的类别,被称为非正式协议。 – 2011-04-06 04:10:27

+0

当然,你可以这样滥用类别(甚至在Apple的文档中也是如此),但是你应该真的声明你的协议使用@protocol/@optional如果这真的是你想要做的 在NSObject上添加一个类别对这个特殊的代码没有特别的意义,重要的部分是respondsToSelector: – Philippe 2011-04-07 03:50:11

相关问题