Pregunta

Tengo un menú que tiene un elemento para cada valor de una enumeración.

El menú:

[ ] Sort by Due Date
[ ] Sort by Priority
[√] Sort by Title

La enumeración:

typedef enum  CW_TASK_SORT_METHOD {
    CWTaskSortMethodDueDate,
    CWTaskSortMethodPriority,
    CWTaskSortMethodTitle
} CWTaskSortMethod;

La propiedad:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod;

¿Cuál es la forma más limpia de cablear esto? Tengo dos ideas pero ambos me parecen insatisfactorias.

primera idea: Crear propiedades para cada valor (sortMethodIsDueDate, setSortMethodIsDueDate: etc.) Estas propiedades llamarían setTaskSortMethod: y llame valueDidChange:@"sortMethodIsDueDate" etc. Los elementos del menú y luego se unen a estas propiedades. Este parece ser un montón de trabajo.

segunda idea: conectar cada elemento de menú a -(IBAction)updateSortMethod:(id)sender que luego podría recorrer los elementos del menú y establecer el valor en función de sender. Este enfoque está bien hasta taskSortMethod se cambia por una sección de código distinta a la que hay que añadir código de punto para mantener el menú en sincronía con taskSortMethod.

I estoy inclinando hacia el primer enfoque, ya que tiene una mejor separación entre el V & C.

Cualquier ideas mejores?

¿Fue útil?

Solución

Creo que estás en el camino correcto con su segunda idea, pero hay algo a tener en cuenta:

NSMenu / NSMenuItem no tienen un concepto de "elemento seleccionado" como NSPopUpButton por ejemplo. Me gustaría usar el mecanismo de objetivo / acción para cambiar el método de clasificación y validación de menú ( Introducción a la interfaz de usuario de validación ) o incluso el método delegado -menu NSMenu: updateItem: atIndex: shouldCancel: ( NSMenuDelegate referencia del protocolo ) para actualizar el estado del elemento basado en el resultado de -taskSortMethod.

Dado que los elementos de menú sólo necesitan ser actualizados cuando se muestran (que este mecanismo hace por usted), usted no tiene que preocuparse por la actualización de los elementos de menú cambia a sí mismo cuando -taskSortMethod en otro lugar.

Ejemplo:

[sortByDueDateMenuItem setState: ([self taskSortMethod] == CWTaskSortMethodDueDate) ];

OMI, esto es mucho más limpio que tratar de enfocarse demasiado en una solución encuadernaciones-Powered.

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