2009-04-10 18 views
7

Estoy tratando de entender lo difícil que es usar NSPopUpButton. Es, de lejos, el elemento de usuario más difícil de programar en Cocoa (al menos en la medida en que lo encuentro).NSPopUpButton, Vinculaciones y una vida útil de acortamiento

El caso de uso que tengo en mente es la siguiente:

  • tengo una clase llamada Puerto que representa un puerto de serie.
  • Entre los atributos es un campo de nombre.
  • En NSPopUpButton quiero mostrar el campo de nombre para cada puerto.
  • Cuando un usuario selecciona un puerto específico, se marca en la ventana emergente con un tic como se esperaba
  • Cuando el usuario presiona un botón de conexión, puedo determinar cuál de los puertos de la matriz fue seleccionado.
  • Me gustaría lograr esto mediante el uso de fijaciones, ya que creo que una vez que lo haya entendido, será la solución más elegante.

tanto en mi AppController.h Estoy contando con dos atributos que me presumiblemente pueden crear propiedades y sintetizar:

NSMutableArray *allPorts; 
Port *currentlySelectedPort; 

y uno de acción en mi .m:

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

en Port.h Tengo

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

I ha he creado un proyecto simple que contiene solo una ventana emergente (y una etiqueta) y después de varios artículos, he logrado poblar un NSMutableArray con elementos que luego uso un ArrayController para mostrar valores y luego al seleccionar el valor de una etiqueta (usando un controlador de objeto). Sin embargo, aunque esto es inteligente, no se ajusta al caso de uso que intento implementar. Así que vuelvo aquí para obtener ayuda

M

+0

Es posible que desee considerar comenzar sin utilizar enlaces. Escribirá más código, pero es imperativo que comprenda ese código (y todas las tecnologías subyacentes detrás de enlaces como KVO) antes de que pueda realmente hacer que las vinculaciones funcionen para usted en ejemplos complejos. –

Respuesta

11

OK, encuadernaciones con el NSPopUpButton son un poco complicado, porque hay dos cosas que necesita: un enlace para los valores, y una unión para la cual se selecciona uno de esos valores . Lo que lo hace aún más complicado es que hay un par de formas perfectamente legítimas de hacerlo, y el que elija depende completamente de la estructura de su programa y, hasta cierto punto, de sus preferencias personales.

Por lo tanto, para obtener una lista de valores, enlazará la propiedad content. En su caso, probablemente vincularía esto a la clave arrangedObjects de NSArrayController. En esta configuración, cada elemento del menú representa un objeto. De forma predeterminada, el título del elemento del menú es la cadena devuelta al llamar al description en cada elemento de la matriz. Si desea utilizar una propiedad diferente para el título del menú, también puede enlazar la matriz contentValues. Sólo asegúrese de que la ruta de la clave que se especifica para contentValues tiene la ruta clave para content como su prefijo (por ejemplo, usted podría usar para arrangedObjectscontent y arrangedObjects.name para contentValues)

Esto le dará elementos de menú que representan objetos. Lo que necesita a continuación es alguna forma de identificar el seleccionado. Hay tres enlaces diferentes que puede usar: selectedIndex, selectedObject y selectedValue.Representan, respectivamente, el índice del objeto de matriz que el usuario seleccionó, el valor del objeto (uno de los objetos en la matriz content) y el título de cadena del elemento seleccionado (uno de los objetos en la matriz contentValues si enlaza esa propiedad).

Por lo tanto, en su caso, puede vincular selectedObject a una propiedad selectedSerialPort en su clase de controlador. Cuando el usuario hace clic en el botón "Conectar", solo tiene que consultar la propiedad selectedSerialPort.

6

Puede descargar un sample Xcode project here. Esto se pega lo más cerca que pude de tu descripción.

Lo importante es ver las conexiones entre el controlador de array, el AppController y el cuadro emergente.

Básicamente, esto solo demuestra lo que dijo Alex.

+0

Abizem, me encantaría aceptar respuestas como su código, ¡con la explicación funcionó! – Clokey

+0

¿Qué sucede si no inicializa su matriz allPorts hasta que despierte? ¿Cómo le dirías a NSPopUpButton que vuelva a cargar los valores? – johnboiles

Cuestiones relacionadas