Introduzione

Le toolbar sono ormai presenti nella maggior parte delle applicazioni e offrono la possibilità di effettuare rapidamente le funzioni più utilizzate in una applicazione. In Cocoa la loro implementazione è relativamente facile.

Creiamo l’interfaccia

Dopo aver creato un progetto di tipo Cocoa Application apriamo il file MainMenu.nib per editarlo. L’unica modifica da effettuare sull’interfaccia grafica consiste nell’aggiungere due voci di menu che permetteranno di mostrare o nascondere la toolbar e di modificarne i suoi elementi.

Fatto ciò creiamo una classe controller che conterrà un solo IBOutlet per la finestra principale dell’applicazione. Creiamo quindi l’IBOutlet che può essere dichiarato staticamente di tipo NSWindow e connettiamolo alla finestra. Ora dovranno essere create due IBAction: una per ognuna delle due voci di menu aggiunte. Una volta create connettiamole alle corrispondenti voci di menu.

L’ultimo passo da effettuare in Interface Builder è quella di impostare il delegato di File’s Owner. Per fare ciò, connettiamo File’s Owner alla classe controller da noi creata.

Questo è tutto quello che va fatto in Interface Builder. A questo punto possiamo esportare la classe controller e tornare ad XCode.

I delegati

Quando si aggiunge una toolbar ad un progetto, è necessario implementare dei metodi delegati di NSToolbar. Ci sono tre metodi obbligatori e due opzionali.

I delegati da implementare obbligatoriamente sono:

- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar

Mentre i delegati opzionali sono:

- (void)toolbarWillAddItem:(NSNotification *)notification
- (void)toolbarDidRemoveItem:(NSNotification *)notification

Ma analizziamoli separatamente assieme ad un esempio di implementazione.

- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
    return [items objectForKey:itemIdentifier];
}

Questo metodo restituisce un NSToolbarItem per l’identificatore passato in input. L’item può essere creato nel metodo o come nell’esempio riportato può essere prelevato da una struttura dati. Questo delegato viene richiamato quando la toolbar viene costruita o quando le viene aggiunto un item.

Dato che gli item della nostra toolbar sono contenuti in un NSDictionary dobbiamo semplicemente restituire l’item nel dizionario corrispondente all’identificatore dato in input.

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar
{
    return [items allKeys];
}

Questo metodo restituisce un array che contiene l’identificatore di ciascun item che è impostato come visibile nella toolbar inclusi i separatori o gli spazi.

Restituiamo un array di chiavi che corrisponde all’insieme degli item contenuti nel dizionario.

- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar
{
    return [[items allKeys] subarrayWithRange:NSMakeRange(0,6)];
}

Questo metodo restituisce un array di identificatori per gli item che faranno parte del set di default della toolbar. Nel codice di esempio impostiamo i primi sei elementi dell’array come il set di default.

- (void) toolbarWillAddItem: (NSNotification *) notification
{
    NSToolbarItem *addedItem = [[notification userInfo] objectForKey:@"item"];

    // effettuare le operazioni necessarie sull'item
}

Questo delegato è chiamato prima che un item venga aggiunto alla toolbar. Dobbiamo quindi usarlo se abbiamo la necessità di effettuare una inizializzazione specifica dell’item.

- (void)toolbarDidRemoveItem:(NSNotification *)notification
{
    NSToolbarItem *addedItem = [[notification userInfo] objectForKey:@"item"];

    // pulire le informazioni correlate all'item
}

Questo delegato è chiamato subito dopo che un item è stato rimosso dalla toolbar. Va quindi usato per rimuovere qualsiasi dato riguardante l’item e che quindi non è più necessario.

Mostrare la toolbar

Ora che abbiamo implementato i delegati dobbiamo creare una istanza della classe NSToolbar. Questo può essere fatto nell’evento awakeFromNin o in windowControllerDidLoadNib nel caso di una applicazione document based. Siccome però ci troviamo in una applicazione Cocoa dobbiamo collegare l’istanza della toolbar nel metodo awakeFromNib.

La prima cosa da fare è creare una istanza di NSToolbar. L’identificatore della toolbar dovrà essere unico perchè tutte le toolbar con uno stesso identificatore saranno sincronizzate nel nostro programma. Quindi quando una toolbar viene personalizzate in una finestra tutte le altre che ne condividono l’identificatore subiranno le stesse modifiche.

toolbar = [[NSToolbar alloc] initWithIdentifier:@"tooltest"];

Dopodichè impostiamo alcune proprietà della toolbar:

[toolbar setDelegate:self];
[toolbar setAllowsUserCustomization:YES];
[toolbar setAutosavesConfiguration:YES];

La prima proprietà imposta il delegato della toolbar ed indica che i metodi delegati si trovano nella classe controller. Successivamente la toolbar viene impostata come personalizzabile e viene impostato il salvataggio automatico delle modifiche.

Ora dobbiamo collegate la toolbar alla finestra della nostra applicazione:

[window setToolbar:toolbar];

Un’altra proprietà che avremmo potuto impostare è:

- (void)setDisplayMode:(NSToolbarDisplayMode)displayMode

che può essere impostata ad uno di questi valori:

NSToolbarDisplayModeIconAndLabel
NSToolbarDisplayModeIconOnly
NSToolbarDisplayModeLabelOnly

Mostrare e personalizzare la toolbar

Ci resta da implementare le IBAction che avevamo creato tramite Interface Builder per mostrare o nascondere la toolbar e per poterla personalizzare.

Per visualizzare il pannello di personalizzazione non dobbiamo far altro che chiamare il metodo runCustomizationPalette. Tutto il resto verrà gestito dal framework Cocoa.

- (IBAction)customize:(id)sender
{
    [toolbar runCustomizationPalette:sender];
}

Per l’IBAction showhide dobbiamo usare il metodo setVisible:(BOOL)shown che prende in input un booleano che indica se la toolbar dovrà essere mostrata o nascosta. Per passare il giusto valore non dobbiamo far altro che negare il valore restituito dal metodo isVisible.

- (IBAction)showhide:(id)sender
{
    [toolbar setVisible:![toolbar isVisible]];
}

Conclusioni

Come potete vedere aggiungere una toolbar alla nostra applicazione è molto semplice.

Questa guida è una mia traduzione dell’articolo originale in lingua inglese.

Versioni

05/05/2008 – Effettuate alcune correzioni grammaticali
05/05/2008 – Pubblicata la versione iniziale