Actualmente estoy tratando de aprender Cocoa y no estoy seguro si entiendo eso correctamente ... Se trata de delegados y controladores.¿Qué es un delegado en Cocoa y por qué debería usarlo?
Al principio: ¿Cuál es la diferencia entre los dos? A veces veo código donde una clase se llama AppController
, a veces - con más o menos el mismo contenido - AppDelegate
.
Por lo tanto, si lo entiendo correctamente, un delegado es un objeto simple que recibe mensajes cuando se produce un determinado evento. Por ejemplo:
@interface WindowController : NSObject <NSWindowDelegate>
@end
@implementation WindowController
- (void)windowDidMiniaturize:(NSNotification *)notification {
NSLog(@"-windowDidMiniaturize");
}
@end
Ahora, utilizo este código para hacer que un delegado de mi window
:
@interface TryingAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain) WindowController *winController;
@end
Con la siguiente implementación:
@implementation TryingAppDelegate
@synthesize window;
@synthesize winController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"-applicationDidFinishLaunching:");
self.winController = [[WindowController alloc] init];
[window setDelegate:winController];
[self.winController release];
}
@end
Y ahora, cada vez que minimizar window
, enviará un mensaje -windowDidMiniaturize:
al WindowController
. ¿Tengo eso correcto?
Si es así, ¿por qué no solo subclase NSWindow
en lugar de preocuparse por una clase adicional de la que debe ocuparse?
¡Gracias! ¿Con qué protocolo debe ajustarse mi controlador? Supongo que cuando uso NSWindowDelegateProtocol no puedo convertirlo en un delegado de 'NSTextField', ¿verdad? ¿Y qué mensajes recibo de esos elementos? Aún 'windowDidMiniaturize' y así sucesivamente? –
He actualizado mi respuesta para incluir algo de información sobre (delegar) protocolos y un ejemplo. – gcbrueckmann