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ąć?

Author: Michiel Kauw-A-Tjoe, 2011-10-07

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. NSTextFields), 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.

 7
Author: gcbrueckmann,
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