NSWindow

时间:2017-06-06 06:45:00

标签: objective-c macos inheritance delegates

我想为NSWindow创建自定义委托。 CustomWindow被子类化以获得有关NSWindowDelegate事件的通知。 现在,我想为此delegate创建CustomWindow

我尝试了以下代码:

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

它按照预期工作,然后发出以下警告:

  

&#39;保留(或强烈)&#39;财产属性&#39;委托&#39;与继承自&#39; NSWindow&#39;

的财产不符      

&#39;原子&#39;财产属性&#39;委托&#39;与继承自&#39; NSWindow&#39;

的财产不符      

物业类型&#39; id&#39;与类型&#39; id _Nullable&#39;不兼容继承自&#39; NSWindow&#39;

     

自动属性合成不会合成属性&#39; delegate&#39 ;;它将由其超类实现,使用@dynamic来确认意图

如何摆脱这些警告?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

NSWindow已经拥有delegate属性,它使用其委托的目的不同于您使用自己的委托。这些错误是您的delegate属性声明与继承属性声明之间的冲突。

最简单的解决方案是将您的财产重命名为customDelegate或类似名称。此外,一般惯例是委托属性为weak,因此您也应该将自己的属性声明为weak

通常,可以将新的委托协议与NSWindowDelegate结合使用,并重用现有的delegate属性。但是,在您的情况下,由于您已声明CustomWindow符合NSWindowDelegate,因此您似乎正在计划将窗口对象设为自己的委托。所以,这会与这种方法发生冲突。但是,为了完整起见,如果您要这样做,您可以将协议声明为NSWindowDelegate的扩展名:

@protocol CustomWindowDelegate <NSWindowDelegate>

您的财产声明必须与NSWindow声明其delegate财产具有相同的属性。所以:

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

最后,由于您依靠NSWindow实际提供了该属性的存储和访问方法,因此您可以通过将其置于@implementation的{​​{1}}来修复上一个警告。 CustomWindow

@dynamic delegate;