Domanda

Ho diversi NSComboBoxes creati in Interface Builder, e quello creato a livello di codice.

I NSComboBoxes creati in Interface Builder sono perfetti. Ho il loro valore legato al controller utente condiviso predefinito, e quando la loro vista si apre Sono seduto lì con il valore corretto. È importante sottolineare che questo valore è indicato come testo "normale" nel NSComboBox. In altre parole, non appare selezionato il valore. Questo è quello che voglio.

Per la NSComboBox che si crea a livello di codice, ho impostato il valore utilizzando selectItemAtIndex: 0. Quando faccio questo, l'elemento corretto è selezionato - ma il testo appare selezionato. Vale a dire, viene evidenziato e tutto. Non voglio questo. Qui ci sono le soluzioni alternative che ho tentato:

(i) Prendi l'editor campo e insieme punto di inserimento alla fine del testo. Questo non funziona, anche se, stranamente, stringa del redattore campo o è nullo o vuoto quando si fa questo. Non sono sicuro se questo è il comportamento corretto per l'editor di campo.

(ii) Provando vari altri modi di impostare il valore della casella combinata, come ad esempio setObjectValue, takeStringValueFrom, ecc.

(iii) Infine, cosa più frustrante, ho cercato di impostare il valore della NSComboBox utilizzando [myComboBox setValue: @ "la voce predefinita" Forkey: @ "valore"]; Questo viene a mancare con objc_exception_throw, presumibilmente perché non esiste una chiave KVC. Ma so che il valore della casella combinata può essere impostato KVO, perché lavora in Interface Builder! Sto indovinando che non conosco il percorso chiave corretta. Ho cercato di elencare tutte le proprietà tramite l'introspezione, ma non riesco a ottenere il corretto funzionamento del codice (objc_property_t non è nelle intestazioni attesi).

Così, ho due domande:

In primo luogo, qualcuno sa come impostare un valore predefinito per NSComboBox di programmazione, in modo che il testo nella casella non è selezionata? Andrò a tutte le lunghezze di fare questo, tra cui una nuova sottoclasse NSComboBoxCell, se si tratta di questo.

In secondo luogo, qualcuno può dirmi che cosa tasto o percorso della chiave IB sta usando per impostare il valore di un NSComboBox? Oppure, in alternativa, il motivo per cui i miei sforzi per fare questo non riescono?

Ho lavorato su questo per molte ore e che sto veramente disspirited!


Grazie, mustISignUp! Così bello avere questo fisso. Un po 'di follow-up:

(i) Selezione del testo è sicuramente causata da fuoco. Chiamata setRefusesFirstResponder: SI risolve il problema. Purtroppo, la finestra vuole davvero concentrarsi su questa casella combinata, come l'impostazione di nuovo refusesFirstResponder NO (più tardi, dopo la finestra di battesimi di) provoca di nuovo la selezione del testo (voglio l'utente sia in grado di concentrarsi su questa casella se si desidera). Pertanto, nel mio caso, la soluzione definitiva è stato quello di chiamare [finestra makeFirstResponder: otherControl]. Stranamente, anche se [finestra makeFirstResponder: nil] non funziona. Tutte le idee perché?

(ii) Grazie per aver ricordato la differenza tra attacchi e le proprietà. Ho imparato molto guardando la questione. Per uno, ho imparato che si può ottenere un elenco di attacchi chiamando - exposedBindings (NSArray *), che per i ritorni NSComboBox (fontSize, l'allineamento, tooltip, fontName, abilitato, contentValues, fontFamilyName, font, nascosto, FontItalic, textColor, valore , contenuti, modificabile, FontBold). In secondo luogo, sono stato in grado di impostare il valore con [myComboBox bind: @ "valore" ToObject: [NSMutableString stringWithString: @ "defaultValue"] withKeyPath: @ opzioni "string": nil], dove NSMutableString ha una categoria su di esso che si trasforma " stringa" in una proprietà. Infine, questo in realtà non risolve la selezione di testo "problema". La differenza tra la selezione del testo con questa casella combinata e quelli in Interface Builder deve essere la loro posizione nella finestra ... Credo che questa casella combinata è solo destinato a diventare initialFirstResponder mentre gli altri non lo erano.

Quindi la mia domanda unica rimasta potrebbe essere il motivo per cui [finestra makeFirstResponder: nil] non funziona a prendere fuoco fuori la casella combinata.Non super-importante, ma sarei curioso di sapere se qualcuno ha un'idea.

È stato utile?

Soluzione

In primo luogo, penso che il testo è stato selezionato perché chiamando selectItemAtIndex: ha fatto la comboBox il firstResponder. Si può usare setRefusesFirstResponder:YES o si potrebbe fare un altro elemento il primo risponditore per rendere il testo non risultano selezionati.

Se ho capito bene e si desidera cambiare la selezione del comboBox si stanno facendo nel modo giusto.

In secondo luogo, si sta confondendo Associazioni e KVC. NSComboBox ha una legame chiamato 'valore', non un proprietà chiamato 'valore'. Non ha senso cercare di impostare con setValue:forKey:, e Interface Builder sicuramente non sta facendo questo.

Si sarebbe ragione a pensare questo è un-evidente e confondendo e nomi forse meglio avrebbero potuto essere scelti per le associazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top