Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSWindow的自定义委托_Objective C_Macos_Inheritance_Delegates - Fatal编程技术网

Objective c NSWindow的自定义委托

Objective c NSWindow的自定义委托,objective-c,macos,inheritance,delegates,Objective C,Macos,Inheritance,Delegates,我想为NSWindow创建一个自定义委托。 CustomWindow被子类化以获得有关NSWindowDelegate事件的通知。 现在我想为这个CustomWindow创建delegate 我尝试了以下代码: 海关窗口 @class CustomWindow; @protocol CustomWindowDelegate - (void)method1:(CustomWindow *)sender userInfo:(NSMutableDictionary*) userInfo; - (v

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

我尝试了以下代码:

海关窗口

@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.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
其工作符合预期,但发出以下警告:

属性“delegate”的“retain(或strong)”属性与从“NSWindow”继承的属性不匹配

属性“委托”上的“原子”属性与从“NSWindow”继承的属性不匹配

属性类型“id”与从“NSWindow”继承的类型“id\u Nullable”不兼容

自动属性合成不会合成属性“委托”;它将由它的超类实现,使用@dynamic来确认意图

我怎样才能摆脱这些警告


非常感谢您的帮助。

NSWindow
已经有了一个
委托
属性,它将委托用于不同的目的,而不是您的目的。这些错误是
委托
属性的声明与继承属性的声明之间的冲突

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

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

@protocol CustomWindowDelegate <NSWindowDelegate>
最后,由于您依赖于
NSWindow
来实际提供属性的存储和访问方法,因此您可以通过将其放入
CustomWindow的
@实现中来修复最后一个警告:

@dynamic delegate;

谢谢“可以将新的委托协议与
NSWindowDelegate
组合并重新使用现有委托属性”的第二个选项适用于我
@property (nullable, assign) id<CustomWindowDelegate> delegate;
@dynamic delegate;