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