2011-04-03 80 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