Quelle est la propre façon de lier les propriétés énumérées?
-
16-09-2019 - |
Question
I ai un menu qui présente un élément pour chaque valeur dans un enum.
Le menu:
[ ] Sort by Due Date
[ ] Sort by Priority
[√] Sort by Title
Le 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 les deux me paraissent pas satisfaisantes.
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 seraient alors se lier à ces propriétés. Cela semble être beaucoup de travail.
2ème idée: Connectez chaque élément de menu à -(IBAction)updateSortMethod:(id)sender
qui pourrait alors itérer les éléments de menu et définissez la valeur en fonction de sender
. Cette approche est bien jusqu'à ce que taskSortMethod
est modifié par une autre section du code à quel code de point doit être ajouté pour maintenir le menu en phase avec taskSortMethod
.
Je penche vers la première approche car il a une meilleure séparation entre le V & C.
Les meilleures idées?
La solution
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'utilise le mécanisme cible / action pour changer la méthode de tri et de validation menu ( introduction à l'interface utilisateur validation ) ou encore la méthode déléguée NSMenu -menu: updateItem: atIndex: shouldCancel: ( NSMenuDelegate Protocole de référence ) pour mettre à jour l'état de l'élément en fonction du résultat de -taskSortMethod.
Étant donné que les éléments de menu ne doivent être mis à jour quand ils sont présentés (ce mécanisme qui fait pour vous), vous n'avez pas à vous soucier de la mise à jour des é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 liaisons.