2017-06-06 61 views
0

我想爲NSWindow創建自定義代理。 CustomWindow被分類以獲得關於NSWindowDelegate事件的通知。 現在我想爲此CustomWindow創建delegateNSWindow的自定義代理

我嘗試下面的代碼:

CustomWindow.h

@class CustomWindow; 

@protocol CustomWindowDelegate 

- (void)method1:(CustomWindow *)sender userInfo:(NSMutableDictionary*) userInfo; 
- (void)method2:(CustomWindow *)sender event:(NSEvent *)theEvent; 
- (void)method3:(CustomWindow *)sender; 

@end 

@interface CustomWindow : NSWindow <NSWindowDelegate> 

@property (nonatomic) id <CustomWindowDelegate> delegate; 

@end 

mainDocument.h

#import "CustomWindow.h" 

@interface mainDocument : NSDocument 

@property (assign) IBOutlet CustomWindow *mainWindow; 

@end 

mainDocument.m

#import "mainDocument.h" 

@implementation mainDocument 

- (void)method1:(CustomWindow *)sender userInfo:(NSMutableDictionary*) userInfo 
{ 
... 
... 
} 

- (void)method2:(CustomWindow *)sender event:(NSEvent *)theEvent 
{ 
... 
... 
} 

- (void)method3:(CustomWindow *)sender 
{ 
... 
... 
} 

@end 

其按預期工作howeve ř其給予以下警告:

「保留(或強)」屬性上屬性「委託」從屬性「委託」「NSWindow」

「原子」屬性繼承的屬性不匹配不匹配從「NSWindow」

房產類型的「id」繼承屬性是與類型不兼容「身份證_Nullable」從「NSWindow」

自動屬性合成將不能合成屬性「委託」繼承;它將通過它的超類實現,使用@dynamic來確認意圖

我該如何擺脫這些警告?

任何幫助,非常感謝。

回答

0

NSWindow已經有一個delegate屬性,它使用它的委託爲不同的目的比你使用你的。錯誤是您的delegate屬性聲明與繼承屬性聲明之間的衝突。

最簡單的解決方案是您可以將您的財產重命名爲customDelegate或類似的東西。此外,一般約定是代表屬性爲weak,因此您應該也可以聲明您的代碼爲weak

通常,可以將新的委託協議與NSWindowDelegate合併,並重新使用現有的delegate屬性。不過,就你而言,由於你聲明CustomWindow符合NSWindowDelegate,所以你似乎打算讓窗口對象成爲它自己的代理。所以,這會與這種方法相沖突。但是,對於完整性,如果你要做到這一點你宣佈你的協議作爲NSWindowDelegate擴展:

@protocol CustomWindowDelegate <NSWindowDelegate> 

你的財產申報必須具有相同的屬性作爲其delegate財產NSWindow的聲明。所以:

@dynamic delegate; 

@property (nullable, assign) id<CustomWindowDelegate> delegate; 

最後,因爲你依靠NSWindow實際提供的屬性的存儲和存取方法,你將這個標籤在@implementationCustomWindow的固定的最後警告

+0

謝謝。 '_one的第二個選項可以將一個新的委託協議與'NSWindowDelegate'結合使用,並重新使用現有的委託屬性_'爲我工作 – Amrita