gpt4 book ai didi

cocoa - Cocoa 中的委托(delegate)是什么?我为什么要使用它们?

转载 作者:行者123 更新时间:2023-12-03 16:04:07 25 4
gpt4 key购买 nike

我目前正在尝试学习 Cocoa,我不确定我是否理解正确......这是关于委托(delegate) Controller

首先:两者有什么区别?有时我会看到代码中的类名为 AppController,有时 - 内容或多或少相同 - AppDelegate

所以,如果我理解正确的话,委托(delegate)是一个简单的对象,它在发生特定事件时接收消息。例如:

@interface WindowController : NSObject <NSWindowDelegate>
@end

@implementation WindowController
- (void)windowDidMiniaturize:(NSNotification *)notification {
NSLog(@"-windowDidMiniaturize");
}
@end

现在,我使用此代码使其成为我的窗口的委托(delegate):

@interface TryingAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}

@property (assign) IBOutlet NSWindow *window;
@property (retain) WindowController *winController;

@end

通过以下实现:

@implementation TryingAppDelegate

@synthesize window;
@synthesize winController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"-applicationDidFinishLaunching:");

self.winController = [[WindowController alloc] init];
[window setDelegate:winController];

[self.winController release];
}

@end

现在,每当我最小化 window 时,它都会向 WindowController 发送一条 -windowDidMiniaturize: 消息。我有这个权利吗?

如果是这样,为什么你不直接子类化 NSWindow 而不是费心去处理一个你必须处理的额外类呢?

最佳答案

当您希望一个对象协调多个其他对象时,委托(delegate)尤其有用。例如,您可以创建 NSWindowController子类并使其成为窗口的委托(delegate)。该同一窗口可能包含您想要使窗口 Controller 成为其委托(delegate)的几个其他元素(例如 NSTextField s)。这样您就不需要对窗口及其几个控件进行子类化。您可以将概念上属于一起的所有代码保留在同一个类中。此外,委托(delegate)通常属于模型- View - Controller 概念的 Controller 级别。通过子类化NSWindow您可以将 Controller 类型代码移至 View 级别。

一个类可以采用任意数量的协议(protocol),因此 <NSWindowDelegate, NSTextFieldDelegate>是完全有效的。然后,您可以将对象设置为任意数量的窗口和文本字段的委托(delegate)。要找出委托(delegate)向类似NSTextField这样的类发送什么消息支持查看class reference .-delegate-setDelegate:方法通常会引导您找到正确的协议(protocol)。在我们的例子中,这是 NSTextFieldDelegate 。对于已添加到旧版本 Apple 框架中的类,通常会有一个关于委托(delegate)方法的附加部分(或者与“类方法”和“实例方法”一起,或者作为“任务”的一个小节)。请注意,将您的类声明为符合委托(delegate)协议(protocol)不会让它们神奇地传递给您的对象 - 您必须显式地将其设置为委托(delegate):

@interface MyWindowController : NSWindowController <NSWindowDelegate, NSTextFieldDelegate> {
NSTextField *_someTextField;
}

@property (nonatomic, retain) IBOutlet NSTextField *someTextField;

@end


@implementation MyWindowController

@synthesize someTextField = _someTextField;

- (void)dealloc {
[_someTextField release];
[super dealloc];
}

- (void)windowDidLoad {
[super windowDidLoad];
// When using a XIB/NIB, you can also set the File's Owner as the
// delegate of the window and the text field.
[[self window] setDelegate:self];
[[self someTextField] setDelegate:self];
}

- (void)windowDidMiniaturize:(NSNotification *)notification {

}

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
return YES;
}

@end

AppControllerAppDelegate只是同一类型的类的不同命名约定。

关于cocoa - Cocoa 中的委托(delegate)是什么?我为什么要使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7686202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com