Pregunta

Tengo varias NSComboBoxes creados en Interface Builder, y uno creado mediante programación.

Los NSComboBoxes creados en Interface Builder son perfectos. Tengo su valor ligado al usuario compartida predeterminada de controlador, y cuando se abre su punto de vista que están sentados allí con el valor correcto. Es importante destacar que este valor se muestra como texto "normal" en el NSComboBox. En otras palabras, el valor no aparece seleccionado. Esto es lo que quiero.

Para el NSComboBox que se crea mediante programación, que establece el valor con selectItemAtIndex: 0. Cuando hago esto, se selecciona el elemento correcto - pero el texto aparece seleccionado. Es decir, se resalta y todo. No quiero esto. Estas son las soluciones que he intentado:

(i) Obtener el editor de campo y el conjunto de puntos de inserción al final del texto. Esto no funciona, aunque, curiosamente, cadena del editor de campo es ya sea nula o vacía cuando se hace esto. No estoy seguro de si este es el comportamiento correcto para el editor de campo.

(ii) Tratar varias otras formas de establecer el valor del cuadro combinado, como setObjectValue, takeStringValueFrom, etc.

(iii) Por último, y lo más frustrante, he tratado de establecer el valor de la NSComboBox usando [myComboBox setValue: @ "El defecto de artículos" forKey: @ "valor"]; Esta falla con objc_exception_throw, presumiblemente debido a que no hay tal KVC clave. Pero sé que el valor del cuadro combinado se puede fijar por MVA, ya que funciona en el constructor de interfaces! Supongo que no sé el camino clave correcta. Traté de enumerar todas las propiedades mediante la introspección, pero no puedo obtener el derecho a trabajar de código (objc_property_t no se encuentra en las cabeceras esperados).

Por lo tanto, tengo dos preguntas:

En primer lugar, ¿alguien sabe cómo establecer un valor predeterminado para NSComboBox mediante programación, por lo que el texto en el cuadro no se ha seleccionado? Voy a llegar a cualquier extremo para hacer esto, incluyendo una nueva subclase NSComboBoxCell, si se trata de eso.

En segundo lugar, ¿Puede alguien decirme qué tecla o ruta de la clave del IB está utilizando para establecer el valor de un NSComboBox? O, alternativamente, por qué mis esfuerzos para hacer esto están fallando?

He estado trabajando en esto durante muchas horas y ahora estoy realmente disspirited!


GRACIAS, mustISignUp! Tan agradable tener esta fijo. Un poco de seguimiento:

(i) Selección del texto es, sin duda causada por el foco. Llamando setRefusesFirstResponder: SÍ soluciona el problema. Por desgracia, la ventana realmente quiere centrarse en esta lista desplegable, como el establecimiento de vuelta a refusesFirstResponder no (más tarde, después de Iniciacion ventana) hace que la selección de texto de nuevo (yo quiero que el usuario sea capaz de concentrarse en esta caja si así lo desea). Por lo tanto, en mi caso, la solución definitiva fue llamar [ventana makeFirstResponder: otherControl]. Curiosamente, sin embargo [ventana makeFirstResponder: nil] no funciona. Cualquier idea por qué?

(ii) Gracias por señalar la diferencia entre fijaciones y propiedades. He aprendido mucho mientras se mira en esta pregunta. Por un lado, he aprendido que se puede obtener una lista de las asociaciones llamando - (NSArray *) exposedBindings, que para las devoluciones NSComboBox (fontSize, alineación, información sobre herramientas, fontName, habilitado, contentValues, fontFamilyName, fuente, oculta, FontItalic, textColor, valor , contenido editable, FontBold). En segundo lugar, yo era capaz de ajustar su valor con [myComboBox aprieto: @ "valor" toObject: [NSMutableString stringWithString: @ "defaultValue"] withKeyPath: @ "cadena" opciones: nil], donde NSMutableString tiene una categoría en él que gira " cadena" en una propiedad. Por último, en realidad esto no soluciona la selección de texto "problema". La diferencia entre la selección de texto con este cuadro combinado y los de Interface Builder debe ser su posición en la ventana ... supongo que este cuadro combinado se acaba candidata a convertirse en initialFirstResponder mientras que los otros no lo eran.

Así que mi única cuestión pendiente podría ser la razón por [ventana makeFirstResponder: nil] no funciona para tomar el foco fuera del cuadro combinado.No es super-importante, pero tengo curiosidad si alguien tiene una idea.

¿Fue útil?

Solución

En primer lugar, creo que el texto está seleccionado porque selectItemAtIndex: que llama ha hecho el cuadro combinado del firstResponder. Se podría utilizar setRefusesFirstResponder:YES o usted podría hacer otro tema, el primer nivel de respuesta para que el texto no aparecen seleccionados.

Si he entendido bien y que desea cambiar la selección del ComboBox que está haciendo de la manera correcta.

En segundo lugar, se está confundiendo Enlaces y KVC. NSComboBox tiene un unión denominado 'valor', no un propiedad denominado 'valor'. No tiene sentido tratar de establecer con setValue:forKey:, Interface Builder y definitivamente no está haciendo esto.

sería justo pensar que esto es no-obvio y confuso y tal vez mejores nombres podrían haber sido elegidos por los enlaces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top