Obecnie próbuję nauczyć się Cocoa i nie jestem pewien, czy rozumiem to poprawnie ... To około delegatów i kontrolerów.Co to jest delegat w Cocoa i dlaczego powinienem z nich korzystać?
Na początku: Jaka jest różnica między tymi dwoma? Czasami widzę kod, w którym klasa nazywa się AppController
, czasami - z mniej więcej taką samą zawartością - AppDelegate
.
Tak więc, jeśli rozumiem to poprawnie, delegat jest prostym obiektem, który odbiera komunikaty po wystąpieniu określonego zdarzenia. Na przykład:
@interface WindowController : NSObject <NSWindowDelegate>
@end
@implementation WindowController
- (void)windowDidMiniaturize:(NSNotification *)notification {
NSLog(@"-windowDidMiniaturize");
}
@end
Teraz używam tego kodu, aby go delegatem mojego window
:
@interface TryingAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain) WindowController *winController;
@end
z następującymi realizacji:
@implementation TryingAppDelegate
@synthesize window;
@synthesize winController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"-applicationDidFinishLaunching:");
self.winController = [[WindowController alloc] init];
[window setDelegate:winController];
[self.winController release];
}
@end
i teraz, ilekroć zminimalizować window
, wyśle wiadomość -windowDidMiniaturize:
do WindowController
. Czy mam to prawo?
Jeśli tak, to dlaczego nie po prostu podklasujesz NSWindow
zamiast zajmować się dodatkową klasą, którą musisz zająć?
Dziękujemy! Jakiego protokołu potrzebuje mój kontroler? Domyślam się, że kiedy używam NSWindowDelegateProtocol, nie mogę uczynić go delegatem 'NSTextField', prawda? A jakie wiadomości otrzymuję z tych elementów? Nadal 'windowDidMiniaturize' i tak dalej? –
Zaktualizowałem swoją odpowiedź, dodając kilka informacji na temat (delegatów) protokołów i przykład. – gcbrueckmann