2010-12-17 14 views
5

Dostaję to dziwne zachowanie. Używam panelu z tekstem do wyświetlenia użytkownikowi, gdy aplikacja czeka na jakieś informacje. Ten panel jest wyświetlany modalnie, aby uniemożliwić użytkownikowi kliknięcie.Jak wymusić sprawdzanie NSToolBar?

Po schowaniu panelu ładowania wszystkie elementy na pasku narzędzi są wyłączone, a metoda validateToolbarItem nie jest wywoływana.

jestem przedstawiający panel w ten sposób:

- (void)showInWindow:(NSWindow *)mainWindow { 
sheetWindow = [self window]; 
[self sheetWillShow]; 

[NSApp beginSheet:sheetWindow modalForWindow:mainWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; 
[NSApp runModalForWindow:sheetWindow]; 
[NSApp endSheet:sheetWindow]; 
[sheetWindow orderOut:self]; 
} 

- (void)dismissModal { 
[sheetWindow close]; 
[NSApp stopModal]; 
} 

Jak mogę zmusić pasek narzędzi do sprawdzania poprawności w tym przypadku?

Edit po komentarzu:

Próbowałem już:

  • [[[NSApp mainWindow] toolbar] validateVisibleItems]
  • [[NSApp mainWindow] update];
  • [NSApp updateWindows];
  • [NSApp setWindowsNeedUpdate:YES];

Wszystko po połączeniu dismissModal. Myślę, że problem jest gdzie indziej ....

Odpowiedz

3
NSToolbar *toolbar; //Get this somewhere. If you have the window it is in, call [window toolbar]; 
[toolbar validateVisibleItems]; 
+0

Z nagłówka: Zwykle nie powinieneś używać tej metody. Ta metoda jest wywoływana w aktualizacjach okien w celu sprawdzania poprawności każdego z widocznych elementów. –

6

Problemem jest to, że NSToolbar wysyła tylko komunikaty walidacji do NSToolbarItem że są typu obrazu, którego żaden z kopalni były. W celu sprawdzenia poprawności dowolnych lub wszystkich NSToolbarItems, utwórz niestandardową podklasę NSToolBar i nadpisaj metodę validateVisibleItems :. Spowoduje to wysłanie komunikatów sprawdzania poprawności do WSZYSTKICH widocznych NSToolbarItem. Jedyna rzeczywista różnica polega na tym, że zamiast włączania lub wyłączania elementu paska zwrotnego BOAR z paska narzędzi Toolbar, należy włączyć lub wyłączyć ten element w samej metodzie sprawdzania poprawności.

@interface CustomToolbar : NSToolbar 
@end 
@implementation CustomToolbar 
-(void)validateVisibleItems 
{ 
    for (NSToolbarItem *toolbarItem in self.visibleItems) 
    { 
     NSResponder *responder = toolbarItem.view; 
     while ((responder = [responder nextResponder])) 
     { 
      if ([responder respondsToSelector:toolbarItem.action]) 
      { 
       [responder performSelector:@selector(validateToolbarItem:) withObject:toolbarItem]; 
      } 
     } 
    } 
} 
@end 

Teraz załóżmy, że masz kontroler z metodą IBAction który obsługuje powództw o NSSegmentedControl w pasku narzędzi:

- (IBAction)backButton:(NSSegmentedControl*)sender 
{ 
    NSInteger segment = sender.selectedSegment; 
    if (segment == 0) 
    { 
     // Action for first button segment 
    } 
    else if (segment == 1) 
    { 
     // Action for second button segment 
    } 
} 

Umieść następujący w tym samym kontrolerze, który obsługuje Działanie elementu paska narzędzi:

-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem 
{ 
    SEL theAction = [toolbarItem action]; 
    if (theAction == @selector(backButton:)) 
    { 
     [toolbarItem setEnabled:YES]; 

     NSSegmentedControl *backToolbarButton = (NSSegmentedControl *)toolbarItem.view; 
     [backToolbarButton setEnabled:YES forSegment:0]; 
     [backToolbarButton setEnabled:NO forSegment:1]; 
    } 
    return NO; 
} 

Powoduje to, że masz pełną kontrolę nad tym, które segmenty są włączone lub wyłączone.

Technika ta powinna mieć zastosowanie do niemal każdego innego rodzaju NSToolbarItem, o ile działanie otrzymane przez element jest obsługiwane przez kontroler w łańcuchu respondenta.

Mam nadzieję, że to pomoże.

+0

Dzięki za odpowiedź! Wydaje się obiecujące :) Jak widzisz, to pytanie jest dość stare. Nie pracuję już w żadnym projekcie OSX, więc jeśli istnieje ktoś (inny niż ty), który może potwierdzić twoją odpowiedź, oznaczę to jako poprawny. Dzięki –

+0

Dzięki.Czułem się trochę niezręcznie, odpowiadając na tak stare pytanie, ale tyle wysiłku szukałem, a po ostatecznym zestawieniu kilku koncepcji w coś, co nie było wielkim kludge, pomyślałem, że dobrze byłoby się nim podzielić. Wiem, że to działa, ale chciałbym wiedzieć, czy istnieje lepsze rozwiązanie, czy też zrobiłem coś, co nie jest uważane za właściwe. –