Attualmente sto cercando di imparare Cocoa e non sono sicuro di averlo capito correttamente ... Si tratta di delegati e controller.Che cos'è un delegato in Cocoa e perché dovrei usarli?
In primo luogo: qual è la differenza tra i due? A volte vedo codice in cui una classe è chiamata AppController
, a volte - con più o meno lo stesso contenuto - AppDelegate
.
Quindi, se ho capito bene, un delegato è un oggetto semplice che riceve messaggi quando si verifica un determinato evento. Per esempio:
@interface WindowController : NSObject <NSWindowDelegate>
@end
@implementation WindowController
- (void)windowDidMiniaturize:(NSNotification *)notification {
NSLog(@"-windowDidMiniaturize");
}
@end
Ora, io uso questo codice per renderlo un delegato della mia window
:
@interface TryingAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain) WindowController *winController;
@end
Con la seguente implementazione:
@implementation TryingAppDelegate
@synthesize window;
@synthesize winController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"-applicationDidFinishLaunching:");
self.winController = [[WindowController alloc] init];
[window setDelegate:winController];
[self.winController release];
}
@end
E ora, ogni volta che minimizzare window
, invierà un messaggio -windowDidMiniaturize:
a WindowController
. Ho ragione?
Se è così, perché non si limita la sottoclasse NSWindow
invece di preoccuparsi di una classe aggiuntiva di cui si deve occuparsi?
Grazie! A quale protocollo deve essere conforme il mio controllore? Suppongo che quando uso NSWindowDelegateProtocol non riesco a renderlo un delegato di un 'NSTextField', vero? E quali messaggi ricevo da quegli elementi? Ancora 'windowDidMiniaturize' e così via? –
Ho aggiornato la mia risposta per includere alcune informazioni sui protocolli (delegato) e un esempio. – gcbrueckmann