Co to jest delegat w kakao i dlaczego powinienem z niego korzystać?
Obecnie próbuję nauczyć się kakao i nie jestem pewien, czy dobrze to Rozumiem... Chodzi o delegatów i kontrolerów .
Na początku: Jaka jest różnica między nimi? Czasami widzę kod, w którym klasa jest nazywana AppController
, czasami-z mniej więcej tą samą treścią - AppDelegate
.
Więc, jeśli dobrze to Rozumiem, delegat jest prostym obiektem, który odbiera wiadomości, gdy wystąpi określone zdarzenie. Na przykład:
@interface WindowController : NSObject <NSWindowDelegate>
@end
@implementation WindowController
- (void)windowDidMiniaturize:(NSNotification *)notification {
NSLog(@"-windowDidMiniaturize");
}
@end
Teraz Ja użyj tego kodu, aby uczynić go delegatem mojego window
:
@interface TryingAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain) WindowController *winController;
@end
Z następującą realizacją:
@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, gdy zminimalizuję window
, wyśle -windowDidMiniaturize:
wiadomość do WindowController
. Mam rację?
Jeśli tak, to dlaczego po prostu nie podklasujesz NSWindow
zamiast zawracać sobie głowy dodatkową klasą, którą musisz się zająć?
1 answers
Delegaty są szczególnie przydatne, gdy chcesz, aby jeden obiekt koordynował kilka innych. Na przykład, możesz utworzyć NSWindowController
podklasę i uczynić ją delegatem window. To samo okno może zawierać kilka innych elementów (np. NSTextField
s), dla których kontroler okna ma być delegatem. W ten sposób nie musisz podklasować okna i kilku jego kontrolek. Możesz zachować cały kod, który koncepcyjnie należy do jednej klasy. Ponadto delegaci Zwykle należą do poziomu kontrolera koncepcji Model-widok-kontroler. Poprzez podklasowanie NSWindow
można przenieść kod typu kontrolera do poziomu widoku.
Klasa może przyjąć dowolną liczbę protokołów, więc {[4] } jest całkowicie poprawna. Następnie można ustawić obiekt jako delegat dowolnej liczby okien i pól tekstowych. Aby dowiedzieć się, jakie komunikaty delegatów obsługuje klasa NSTextField
, sprawdź numer class reference.Metody -delegate
i -setDelegate:
zazwyczaj wskażą ci właściwy protokół. W naszym przypadku jest toNSTextFieldDelegate
. W przypadku klas, które zostały dodane do starszych wersji frameworków Apple często znajduje się dodatkowa sekcja dotycząca metod delegowania (obok "metod klas" i "metod instancji" lub jako podsekcja "Zadań"). Zauważ, że zadeklarowanie twojej klasy jako zgodnej z protokołem delegata nie spowoduje, że zostaną one magicznie dostarczone do Twojego obiektu – musisz jawnie ustawić ją jako delegata:
@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
AppController
i AppDelegate
są po prostu odmiennymi konwencjami nazewnictwa dla tej samej klasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 15:55:06