2012-07-12 22 views
5

Mam element menu w głównym menu aplikacji i chciałbym skierować jego działanie do kontrolera widoku (NSViewController). Hierarchia interfejsu wygląda następująco: Główny kontroler okna aplikacji to NSWindowController. Wewnątrz okna znajduje się widok podzielony, a prawy widok w widoku podzielonym jest kontrolowany przez NSViewController.Jak przekierować akcje menu do kontrolera NSViewController w oknie?

Window + NSWindowController 
    `-- NSSplitView 
      `-- NSView 
      `-- NSView + NSViewController 

Pozycja menu jest podłączona do First Responder w Konstruktorze interfejsu. Kontroler widoku implementuje odpowiednią metodę, ale element menu pozostaje wyłączony. Po przeniesieniu metody do NSWindowController włączany jest element menu.

Pomyślałem, że muszę ustawić kontroler widoku w łańcuchu responderów, więc ustawiłem go jako nextResponder dla kontrolera okna; bez cygara. Co ja robię źle?

+0

Możesz dodać obiekt do IB, reprezentujący kontroler. Następnie połącz działanie menu z IBAction swojego kontrolera. –

+0

Niestety nie jest to możliwe, kontrolery widoku zmieniają się zgodnie z tym, co zostało wybrane w lewym panelu widoku podziału. – zoul

+0

Następnie trzeba ponownie zaimportować akcję menu za każdym razem, gdy widok się skupi. Aby uzyskać dostęp do tego menu: [[[[[NSApp mainMenu] itemWithTitle: @ "ItemName"] menu] itemWithTitle @ "Nazwa przedmiotu" setAction: @ "Selector (theSelector)] –

Odpowiedz

3

W końcu dodałem klasę bazową dla moich kontrolerami okiennych i uczynił go naprzód wzywa do „dziecko” regulatorów:

- (id) childControllerForSelector: (SEL) selector 
{ 
    for (id controller in [childControllers copy]) 
     if ([controller respondsToSelector:selector]) 
      return controller; 
    return nil; 
} 

- (BOOL) respondsToSelector: (SEL) selector 
{ 
    return [super respondsToSelector:selector] ? YES : 
     [self childControllerForSelector:selector] ? YES : 
      NO; 
} 

- (void) forwardInvocation: (NSInvocation*) invocation 
{ 
    id child = [self childControllerForSelector:[invocation selector]]; 
    [invocation invokeWithTarget:child]; 
} 

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector 
{ 
    NSMethodSignature *signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     id child = [self childControllerForSelector:selector]; 
     signature = [child methodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

to dużo kodu, ale jest to ogólne rozwiązanie, które utrzymuje kontroler kod wolny od przekierowania ad-hoc. Mam nadzieję, że to nie jest za dużo magii.

1

Możesz ustawić kontroler okien jako delegata okna, aby był teraz częścią łańcucha respondentów.

Zakładając, że masz własną podklasę NSWindowController, możesz po prostu uchwycić tam zdarzenie menu i wywołać odpowiednie metody w kontrolerach.

Niestety, docs porady dotyczące próby wstawienia czegokolwiek w łańcuchu respondentów między różnymi widokami i subspekcjami, więc nie można po prostu wycisnąć tam kontrolera widoku.

Więcej here, ale przyjmuję, że już się z nim skonsultowałeś.