Frage

Ich habe ein Menü, das für jeden Wert in einer Aufzählung ein Element enthält.

Das Menü:

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

Die Aufzählung:

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

Die Eigenschaft:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod;

Wie verkabelt man das am saubersten?Ich habe zwei Ideen, aber beide erscheinen mir unbefriedigend.

1. Idee:Erstellen Sie Eigenschaften für jeden Wert (sortMethodIsDueDate, setSortMethodIsDueDate: usw.) Diese Eigenschaften würden aufgerufen setTaskSortMethod: und Ruf an valueDidChange:@"sortMethodIsDueDate" usw.Die Menüelemente würden dann an diese Eigenschaften gebunden.Das scheint eine Menge Arbeit zu sein.

2. Idee:Verbinden Sie jeden Menüpunkt mit -(IBAction)updateSortMethod:(id)sender Dies könnte dann die Menüelemente iterieren und den Wert abhängig davon festlegen sender.Dieser Ansatz ist in Ordnung, bis taskSortMethod wird durch einen anderen Codeabschnitt geändert, an dem Code hinzugefügt werden muss, um das Menü synchron zu halten taskSortMethod.

Ich tendiere zum ersten Ansatz, da er eine bessere Trennung zwischen V und C bietet.

Irgendwelche besseren Ideen?

War es hilfreich?

Lösung

Ich denke, dass Sie mit Ihrer zweiten Idee auf dem richtigen Weg sind, aber es gibt etwas zu beachten:

NSMenu / NSMenuItem haben kein Konzept für „ausgewählte Elemente“ wie beispielsweise NSPopUpButton.Ich würde den Ziel-/Aktionsmechanismus verwenden, um die Sortiermethode und die Menüvalidierung zu ändern (Einführung in die Benutzeroberflächenvalidierung) oder sogar die NSMenu-Delegatenmethode -menu:updateItem:atIndex:shouldCancel:(Referenz zum NSMenuDelegate-Protokoll), um den Status des Elements basierend auf dem Ergebnis von -taskSortMethod zu aktualisieren.

Da die Menüelemente nur dann aktualisiert werden müssen, wenn sie angezeigt werden (was dieser Mechanismus für Sie erledigt), müssen Sie sich nicht darum kümmern, die Menüelemente selbst zu aktualisieren, wenn -taskSortMethod sich an anderer Stelle ändert.

Ex:

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

Meiner Meinung nach ist das viel sauberer als der Versuch, eine bindungsbasierte Lösung zu überentwickeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top