2009-11-04 6 views
2

J'ai un menu qui a un élément pour chaque valeur dans une énumération.Quel est le moyen le plus propre de lier les propriétés énumérées?

Le menu:

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

ENUM:

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

La propriété:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod; 

Quelle est la façon la plus propre au fil de ça? J'ai deux idées mais toutes deux me paraissent insatisfaisantes.

1ère idée: Créer des propriétés pour chaque valeur (sortMethodIsDueDate, setSortMethodIsDueDate: etc.) Ces propriétés appelleraient setTaskSortMethod: et appeler valueDidChange:@"sortMethodIsDueDate" etc. Les éléments du menu serait alors se lier à ces propriétés. Cela semble beaucoup de travail.

2ème idée: Connectez chaque élément de menu à -(IBAction)updateSortMethod:(id)sender, qui pourrait ensuite itérer les éléments de menu et définir la valeur en fonction de sender. Cette approche est correcte jusqu'à ce que taskSortMethod soit modifié par une section de code différente à laquelle le code de point doit être ajouté pour maintenir le menu en synchronisation avec taskSortMethod.

Je penche vers la première approche car il a une meilleure séparation entre le V & C.

Les meilleures idées?

Répondre

2

Je pense que vous êtes sur la bonne voie avec votre deuxième idée, mais il y a quelque chose à considérer:

NSMenu/NSMenuItem n'ont pas un concept de « élément sélectionné » comme NSPopUpButton par exemple. J'utiliserais le mécanisme cible/action pour changer la méthode de tri et la validation du menu (Introduction to User Interface Validation) ou même la méthode déléguée NSMenu -menu: updateItem: atIndex: shouldCancel: (NSMenuDelegate Protocol Reference) pour mettre à jour l'état de l'item en fonction du résultat de -taskSortMethod. Comme les éléments de menu n'ont besoin d'être mis à jour que lorsqu'ils sont affichés (ce que ce mécanisme fait pour vous), vous n'avez pas à vous soucier de mettre à jour les éléments de menu vous-même lorsque -taskSortMethod change ailleurs.

Ex:

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

OMI, c'est beaucoup plus propre que d'essayer de trop concevoir une solution à propulsion des liaisons.

+0

Je suis parti avec la 2ème approche. Je pense que la prochaine fois que ce problème surgira je vais créer un cours pour y remédier. Je suis surpris qu'il n'y ait pas de solution plus élégante. –

Questions connexes