6 Stimmen

Wie erzwingt man die Validierung der NSToolBar?

Ich erhalte dieses seltsame Verhalten. Ich verwende ein Panel mit Text, um dem Benutzer zu zeigen, wenn die App für einige Informationen wartet. Dieses Panel ist modal zeigen, um den Benutzer zu verhindern, etwas zu klicken.

Wenn das Ladefeld ausgeblendet ist, sind alle Elemente der Symbolleiste deaktiviert und die validateToolbarItem Methode nicht aufgerufen wird.

Ich zeige das Panel auf diese Weise:

- (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];
}

Wie kann ich die Symbolleiste in diesem Fall zur Validierung zwingen?

Nach Kommentar bearbeiten:

Ich habe es bereits versucht:

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

Alle nach Anruf dismissModal . Ich denke, dass das Problem anderswo liegt....

8voto

Chuck H Punkte 6113

Das Problem ist, dass NSToolbar nur Validierungsmeldungen an NSToolbarItems sendet, die vom Typ Image sind, was bei mir nicht der Fall war. Um eine oder alle NSToolbarItems zu überprüfen, erstellen Sie eine benutzerdefinierte Unterklasse von NSToolBar und überschreiben Sie die validateVisibleItems: Methode. Dadurch werden Validierungsmeldungen an ALLE sichtbaren NSToolbarItems gesendet. Der einzige wirkliche Unterschied besteht darin, dass die Toolbar-Klasse das Element nicht mit dem zurückgegebenen BOOL aktivieren oder deaktivieren muss, sondern dass Sie das Element in der Validierungsmethode selbst aktivieren oder deaktivieren müssen.

@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

Nehmen Sie nun an, Sie haben einen Controller mit einer IBAction-Methode, die Aktionen für ein NSSegmentedControl in Ihrer Symbolleiste verarbeitet:

- (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
    }
}

Platzieren Sie das Folgende in demselben Controller, der die Aktion des Symbolleistenelements verarbeitet:

-(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;
}

Das Ergebnis ist, dass Sie die vollständige Kontrolle darüber haben, welche Segmente aktiviert oder deaktiviert sind.

Diese Technik sollte auf fast jeden anderen Typ von NSToolbarItem anwendbar sein, solange die Received Action des Elements von einem Controller in der Responder-Kette behandelt wird.

Ich hoffe, das hilft.

5voto

ughoavgfhw Punkte 39353
NSToolbar *toolbar; //Get this somewhere. If you have the window it is in, call [window toolbar];
[toolbar validateVisibleItems];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X