2 Stimmen

Wie kann ich den Wert von NSComboBox mit KVC setzen?

Ich habe mehrere NSComboBoxes, die in Interface Builder erstellt wurden, und eine, die programmatisch erstellt wurde.

Die in Interface Builder erstellten NSComboBoxes sind perfekt. Ihr Wert ist an den Shared User Default Controller gebunden, und wenn ihre Ansicht geöffnet wird, sitzen sie dort mit dem korrekten Wert. Wichtig ist, dass dieser Wert als "normaler" Text im NSComboBox angezeigt wird. Mit anderen Worten, der Wert erscheint nicht als ausgewählt. Das ist das, was ich möchte.

Für die NSComboBox, die programmatisch erstellt wurde, setze ich den Wert mit selectItemAtIndex:0. Wenn ich dies tue, wird das korrekte Element ausgewählt, aber der Text erscheint als ausgewählt. Das heißt, er ist hervorgehoben und alles. Das möchte ich nicht. Hier sind die Workarounds, die ich versucht habe:

(i) Den Feldeditor abrufen und den Einfügepunkt ans Ende des Textes setzen. Dies funktioniert nicht, obwohl der Feldeditor-String entweder nil oder leer ist, wenn dies geschieht. Ich bin mir nicht sicher, ob dies das korrekte Verhalten für den Feldeditor ist.

(ii) Verschiedene andere Möglichkeiten ausprobieren, den Wert der ComboBox zu setzen, wie setObjectValue, takeStringValueFrom, usw.

(iii) Schließlich und am frustrierendsten habe ich versucht, den Wert der NSComboBox mit [myComboBox setValue:@"Der Standardwert" forKey:@"wert"]; zu setzen. Dies schlägt mit objc_exception_throw fehl, vermutlich weil es keinen solchen KVC-Schlüssel gibt. Aber ich weiß, dass der Wert der ComboBox über KVO gesetzt werden kann, weil es im Interface Builder funktioniert! Ich vermute, dass ich den korrekten Schlüsselpfad nicht kenne. Ich habe versucht, alle Eigenschaften durch Introspektion aufzulisten, aber ich kann den Code nicht richtig zum Laufen bringen (objc_property_t ist nicht in den erwarteten Headern).

Also habe ich zwei Fragen:

Erstens, weiß jemand, wie man programmatisch einen Standardwert für NSComboBox setzt, damit der Text in der Box nicht ausgewählt ist? Ich werde jede Mühe darauf verwenden, dies zu tun, einschließlich einer neuen NSComboBoxCell-Subklasse, wenn es sein muss.

Zweitens, kann mir jemand sagen, welchen Schlüssel oder welchen Schlüsselpfad IB verwendet, um den Wert einer NSComboBox zu setzen? Oder alternativ, warum meine Bemühungen, dies zu tun, scheitern?

Ich arbeite jetzt seit vielen Stunden daran und bin wirklich niedergeschlagen!


DANKE, mustISignUp! Es ist so schön, dass es behoben ist. Ein wenig Nacharbeit:

(i) Die Auswahl des Textes wird definitiv durch den Fokus verursacht. Der Aufruf von setRefusesFirstResponder:YES behebt das Problem. Leider möchte das Fenster wirklich den Fokus auf diese Combo-Box legen, da das Festlegen von refusesFirstResponder auf NO (später, nach der Fensterinitialisierung) wieder Textauswahl verursacht (Ich möchte, dass der Benutzer auf diese Box fokussieren kann, wenn er möchte). Daher war die definitive Lösung in meinem Fall, [window makeFirstResponder:otherControl] aufzurufen. Seltsamerweise funktioniert jedoch [window makeFirstResponder:nil] nicht. Irgendwelche Ideen warum?

(ii) Vielen Dank für den Hinweis auf den Unterschied zwischen Bindungen und Eigenschaften. Ich habe viel gelernt, als ich diese Frage untersucht habe. Unter anderem habe ich gelernt, dass man eine Liste von Bindungen bekommen kann, indem man - (NSArray *)exposedBindings aufruft, was für NSComboBox (fontSize, alignment, toolTip, fontName, enabled, contentValues, fontFamilyName, font, hidden, fontItalic, textColor, value, content, editable, fontBold) zurückgibt. Zweitens konnte ich den Wert mit [myComboBox bind:@"value" toObject:[NSMutableString stringWithString:@"Standardwert"] withKeyPath:@"string" options:nil] setzen, wobei NSMutableString eine Kategorie hat, die "string" in eine Eigenschaft umwandelt. Dies löst das Textauswahl-Problem tatsächlich nicht. Der Unterschied zwischen Textauswahl mit dieser ComboBox und denen in Interface Builder muss deren Position im Fenster sein... Ich vermute, dass diese ComboBox einfach dazu bestimmt ist, initialFirstResponder zu werden, während die anderen nicht.

Also bleibt mir nur noch die Frage, warum [window makeFirstResponder:nil] nicht funktioniert, um den Fokus von der ComboBox zu nehmen. Nicht super-wichtig, aber ich wäre neugierig, ob jemand eine Idee hat.

2voto

hooleyhoop Punkte 9087

Zunächst denke ich, dass der Text ausgewählt ist, weil die Methode selectItemAtIndex: den ComboBox zum firstResponder gemacht hat. Du könntest setRefusesFirstResponder:YES verwenden oder ein anderes Element zum first responder machen, um den Text nicht erscheinen zu lassen.

Wenn ich das richtig verstanden habe und du die Auswahl des ComboBox ändern möchtest, machst du es auf die richtige Weise.

Zweitens verwechseln Sie Bindungen und KVC. NSComboBox hat eine Bindung namens 'value', nicht eine Eigenschaft namens 'value'. Es macht keinen Sinn, es mit setValue:forKey: zu setzen, und Interface Builder macht das definitiv nicht.

Es wäre richtig zu denken, dass dies unoffensichtlich und verwirrend ist und vielleicht hätten bessere Namen für die Bindungen gewählt werden können.

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