Domanda

Ho un menu che ha una voce per ogni valore in un enum.

Il menu:

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

L'enum:

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

La proprietà:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod;

Qual è il modo più pulito per legare questo in su? Ho due idee, ma entrambi mi sembrano insoddisfacenti.

prima idea: Creare proprietà per ogni valore (sortMethodIsDueDate, setSortMethodIsDueDate: ecc) Queste proprietà chiamerebbero setTaskSortMethod: e chiamare valueDidChange:@"sortMethodIsDueDate" ecc Le voci del menu avrebbero quindi associare a queste proprietà. Questo mi sembra un sacco di lavoro.

2 ° idea: Collegare ogni voce di menu per -(IBAction)updateSortMethod:(id)sender che potrebbe poi iterare le voci di menu e impostare il valore a seconda sender. Questo approccio è bene fino a quando taskSortMethod viene modificata da una diversa sezione di codice in cui il codice punto deve essere aggiunto per mantenere il menu in sincronia con taskSortMethod.

sto appoggiato verso il primo approccio in quanto ha una migliore separazione tra il V & C.

Tutte le idee migliori?

È stato utile?

Soluzione

Credo che tu sia sulla strada giusta con la seconda idea, ma c'è una cosa da considerare:

NSMenu / NSMenuItem non hanno un concetto di "voce selezionata" come NSPopUpButton per esempio. Userei il meccanismo di destinazione / azione per cambiare il metodo di ordinamento e il menu di convalida ( Introduzione alla User Interface Validation ) o anche il NSMenu metodo delegato -menu: updateItem: atIndex: shouldCancel: ( NSMenuDelegate Protocol Reference ) per aggiornare lo stato della voce in base al risultato di -taskSortMethod.

Dal momento che le voci di menu solo bisogno di essere aggiornato quando sono mostrati (che questo meccanismo fa per voi), non si dispone di preoccuparsi di aggiornare le voci di menu se stessi quando -taskSortMethod cambia altrove.

Esempio:

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

IMO, questo è molto più pulito di cercare di over-ingegnerizzare una soluzione binding-alimentati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top