Frage

Ich habe mehrere NSComboBoxes im Interface Builder erstellt, und ein programmatisch erstellt.

Die NSComboBoxes im Interface Builder erstellt wurden, sind perfekt. Ich habe ihren Wert auf den Shared User Default-Controller gebunden, und wenn ihre Ansicht geöffnet wird sie sitzt da mit dem richtigen Wert. Wichtig ist, wird dieser Wert als „normal“ Text in der NSComboBox gezeigt. Mit anderen Worten, der Wert nicht ausgewählt erscheinen. Dies ist, was ich will.

Für die NSComboBox, die programmatisch erstellt wird, habe ich den Wert selectItemAtIndex mit: 0 gewonnen. Wenn ich dies tun, wird das richtige Element ausgewählt - aber der Text erscheint ausgewählt. Das heißt, es wird hervorgehoben und alles. Ich will das nicht. Hier sind die Abhilfen ich versucht habe:

(i) Holen Sie sich das Feldeditor und Satz Einfügemarke an das Ende des Textes. Das funktioniert nicht, obwohl seltsamerweise die Zeichenfolge des Feldeditor ist entweder Null oder leeren, wenn dies zu tun. Ich bin mir nicht sicher, ob dies die richtige Verhalten für den Feldeditor ist.

(ii) Der Versuch, verschiedene andere Möglichkeiten der Einstellung des Wertes des Kombinationsfelds, wie setObjectValue, takeStringValueFrom, etc.

(iii) Schließlich, und die meisten frustrierende habe ich versucht, den Wert des NSComboBox mit [MeineComboBox setValue: @ „Der Standard Element“ forKey: @ „Wert“] zu setzen; Dies scheitert mit objc_exception_throw, vermutlich, weil es keine solche KVC Schlüssel. Aber ich weiß, dass der Wert des Kombinationsfelds kann durch KVO eingestellt werden, weil es in Interface Builder funktioniert! Ich vermute, dass ich weiß nicht, den richtigen Schlüssel Weg. Ich habe versucht, alle Eigenschaften mit Selbstbeobachtung aufzuzählen, aber ich kann den Code nicht richtig funktioniert bekommen (objc_property_t ist nicht in dem erwarteten Header).

Also, ich habe zwei Fragen:

Zuerst jemand weiß, wie man einen Standardwert für NSComboBox einzustellen programmatisch, so dass der Text in der Box nicht aktiviert ist? Ich werde zu allen möglichen Längen gehen, dies zu tun, darunter eine neue NSComboBoxCell Unterklasse, wenn es dazu kommt.

Zweitens kann mir jemand sagen, welche Taste oder Tasten Pfad IB den Wert eines NSComboBox gesetzt verwendet? Oder alternativ, warum meine Bemühungen, dies zu tun versagen?

Ich habe jetzt viele Stunden auf dieser gearbeitet und ich bin wirklich disspirited!


DANKE, mustISignUp! So schön diese behoben haben. Ein wenig Followup:

(i) Auswahl des Textes wird auf jeden Fall von Fokus verursacht. Der Aufruf setRefusesFirstResponder: JA behebt das Problem. Leider will das Fenster wirklich auf diesem Kombinationsfeld konzentrieren, wie refusesFirstResponder zurück zu NO (später, nach Initiation Fenstern) Einstellung wieder Textauswahl verursacht (ich mag der Benutzer auf diesem Feld konzentrieren zu können, wenn er es wünscht). Daher ist in meinem Fall war die endgültige Lösung [Fenster makeFirstResponder: otherControl] zu nennen. Merkwürdig ist, dass obwohl [Fenster makeFirstResponder: nil] funktioniert nicht. Irgendwelche Ideen, warum?

(ii) Vielen Dank für den Hinweis, den Unterschied zwischen Bindungen und Eigenschaften aus. Ich habe viel gelernt, während in dieser Frage suchen. Zum einen habe ich gelernt, dass Sie eine Liste von Bindungen durch den Aufruf erhalten - (NSArray *) exposedBindings, die für NSComboBox zurückkehrt (Schriftgröße, Ausrichtung, toolTip, Schriftname, aktiviert, content, fontFamilyName, Schriftart, versteckt, FontItalic, Textfarbe, Wert , Inhalt, editierbar, FontBold-). Zweitens, ich war in der Lage, den Wert unter Verwendung von auf [MeineComboBox binden: @ "Wert" toObject: [NSMutableString stringWithString: @ "default"] withKeyPath: @ "string" Optionen: nil], wobei NSMutableString eine Kategorie hat darauf, dass turns " string“in eine Eigenschaft. Schließlich hat dieses Problem behebt eigentlich nicht die Textauswahl „Problem“. Der Unterschied zwischen Textauswahl mit diesem Kombinationsfeld und dem in Interface Builder muß ihre Position im Fenster sein ... Ich denke, dass diese Combo-Box ist nur initialFirstResponder zu werden geplant, während die andere nicht.

So ist meine einzige verbleibende Frage könnte sein, warum [Fenster makeFirstResponder: nil] nicht funktioniert Fokus aus dem Kombinationsfeld zu nehmen.Nicht super-wichtig, aber ich wäre neugierig, wenn jemand eine Idee hat.

War es hilfreich?

Lösung

Zum einen denke ich, der Text ausgewählt, weil Aufruf selectItemAtIndex: die comboBox die firstResponder gemacht hat. Sie könnten setRefusesFirstResponder:YES verwenden, oder Sie können ein anderes Element der Ersthelfer machen, um den Text zu machen nicht ausgewählt erscheinen.

Wenn ich es richtig verstanden habe, und Sie möchten die Auswahl des comboBox ändern Sie es richtig tun.

Zweitens Sie sind verwirrend Bindungen und KVC. NSComboBox hat einen Bindung genannt 'Wert', nicht ein Eigenschaft genannt 'Wert'. Es ist sinnlos zu versuchen, es mit setValue:forKey: zu setzen und Interface Builder auf jeden Fall ist dies nicht zu tun.

Sie haben Recht in der Annahme, das ist un-klar und verwirrend und vielleicht bessere Namen für die Bindungen gewählt werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top