我想为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来确认意图
如何摆脱这些警告?
非常感谢任何帮助。
答案 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;