Какой самый чистый способ связать перечислимые свойства?

StackOverflow https://stackoverflow.com/questions/1676421

Вопрос

У меня есть меню, в котором есть элемент для каждого значения перечисления.

Меню:

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

Перечисление:

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

Недвижимость:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod;

Какой самый чистый способ это подключить?У меня есть две идеи, но обе кажутся мне неудовлетворительными.

1-я идея:Создайте свойства для каждого значения (sortMethodIsDueDate, setSortMethodIsDueDate: и т. д.) Эти свойства будут вызывать setTaskSortMethod: и позвони valueDidChange:@"sortMethodIsDueDate" и т. д.Затем пункты меню будут привязаны к этим свойствам.Кажется, это большая работа.

2-я идея:Подключите каждый пункт меню к -(IBAction)updateSortMethod:(id)sender который затем мог бы перебирать пункты меню и устанавливать значение в зависимости от sender.Этот подход хорош до тех пор, пока taskSortMethod изменяется другим разделом кода, и в этот момент необходимо добавить код, чтобы синхронизировать меню с taskSortMethod.

Я склоняюсь к первому подходу, поскольку он обеспечивает лучшее разделение между V и C.

Есть идеи получше?

Это было полезно?

Решение

Я думаю, что вы на правильном пути со своей второй идеей, но есть кое-что, что следует учитывать:

NSMenu/NSMenuItem не имеет понятия «выбранный элемент», как, например, NSPopUpButton.Я бы использовал механизм цели/действия, чтобы изменить метод сортировки и проверку меню (Введение в проверку пользовательского интерфейса) или даже метод делегата NSMenu -menu:updateItem:atIndex:shouldCancel:(Справочник по протоколу NSMenuDelegate), чтобы обновить состояние элемента на основе результата -taskSortMethod.

Поскольку элементы меню необходимо обновлять только тогда, когда они отображаются (что и делает этот механизм), вам не нужно беспокоиться об обновлении элементов меню самостоятельно, когда -taskSortMethod изменяется в другом месте.

Бывший:

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

ИМХО, это намного чище, чем пытаться перепроектировать решение на основе привязок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top