2009-04-10 19 views
7

Sto cercando di capire quanto sia difficile utilizzare NSPopUpButton. È di gran lunga l'elemento utente più difficile da programmare in Cocoa (almeno per quanto lo trovo).NSPopUpButton, binding e durata della riduzione

Il caso d'uso che ho in mente è la seguente:

  • ho una classe denominata Port che rappresenta una porta seriale.
  • Tra gli attributi c'è un campo nome.
  • In NSPopUpButton voglio visualizzare il campo del nome per ogni porta.
  • Quando un utente seleziona una porta specifica viene contrassegnato nel pop-up con un segno di spunta come previsto
  • Quando l'utente successivamente colpisce un pulsante di connessione, è possibile verificare quale delle porte della matrice è stata selezionata.
  • Mi piacerebbe ottenere questo risultato utilizzando associazioni poiché penso che una volta che avrò la testa intorno a esso, sarà la soluzione più elegante.

Perciò nel mio AppController.h Mi aspetto due attributi che posso presumibilmente creare come proprietà e sintetizzare:

NSMutableArray *allPorts; 
Port *currentlySelectedPort; 

e uno d'azione nella mia .m:

-(void)didSelectConnect:(id)sender{ 
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]); 
} 

in Port.h I have

NSString *name; 
NSString *baudRate; 
... etc ... 

I ha Ho creato un semplice progetto che contiene solo un pop-up (e un'etichetta) e seguendo vari articoli, sono riuscito a popolare un NSMutableArray con elementi che poi uso un ArrayController per visualizzare i valori e quindi sulla selezione impostare il valore di un'etichetta (utilizzando un controller di oggetto). Tuttavia, per quanto questo sia intelligente, non si adatta al caso d'uso che sto cercando di implementare. Quindi mi rivolgo qui per aiuto

M

+0

Si potrebbe prendere in considerazione l'idea di iniziare senza utilizzare i collegamenti. Scriverai altro codice, ma è imperativo che tu capisca quel codice (e tutte le tecnologie sottostanti dietro i binding come KVO) prima che tu possa davvero far funzionare i binding per te in esempi complessi. –

risposta

11

OK, attacchi con il NSPopUpButton sono un po 'complicato, perché ci sono due cose di cui ha bisogno: un vincolante per i valori, e un binding per il quale è selezionato uno di questi valori . Ciò che lo rende ancora più complicato è che ci sono un paio di modi perfettamente legittimi per farlo, e quale si sceglie interamente dipende dalla struttura del programma e, in una certa misura, dalle preferenze personali.

Quindi, per ottenere un elenco di valori, si associa la proprietà content. Nel tuo caso, probabilmente lo associ alla chiave arrangedObjects di uno NSArrayController. In questa configurazione, ciascuna voce di menu rappresenta un oggetto. Per impostazione predefinita, il titolo della voce di menu è la stringa restituita chiamando description su ciascun elemento dell'array. Se si desidera utilizzare una proprietà diversa per il titolo del menu, è anche possibile associare l'array contentValues. Basta fare in modo il percorso della chiave specificato per contentValues ha il percorso chiave per content come prefisso (per esempio si potrebbe utilizzare per arrangedObjectscontent e arrangedObjects.name per contentValues)

Questo vi darà le voci di menu che rappresentano oggetti. Quello di cui hai bisogno in seguito è un modo per identificare quello selezionato. Esistono tre diversi collegamenti che è possibile utilizzare: selectedIndex, selectedObject e selectedValue.Rappresentano, rispettivamente, l'indice dell'oggetto matrice selezionato dall'utente, il valore dell'oggetto (uno degli oggetti nell'array content) e il titolo della stringa dell'elemento selezionato (uno degli oggetti nell'array contentValues se si rilegge quella proprietà).

Quindi, nel tuo caso, è possibile associare selectedObject a una proprietà selectedSerialPort sulla classe controller. Quando l'utente fa clic sul pulsante "Connetti", è sufficiente fare riferimento alla proprietà selectedSerialPort.

6

È possibile scaricare un sample Xcode project here. Questo si avvicina il più vicino possibile alla tua descrizione.

L'importante è osservare le connessioni tra il controller di array, l'AppController e la finestra a comparsa.

Fondamentalmente, questo dimostra solo ciò che Alex ha detto.

+0

Abizem, mi piacerebbe accettare le risposte come il tuo codice, con la spiegazione ha funzionato a meraviglia! – Clokey

+0

Cosa succede se non si inizializza l'array allPorts fino a quando svegliFromNib? Come diresti a NSPopUpButton di ricaricare i valori? – johnboiles

Problemi correlati