Какой самый чистый способ связать перечислимые свойства?
-
16-09-2019 - |
Вопрос
У меня есть меню, в котором есть элемент для каждого значения перечисления.
Меню:
[ ] 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) ];
ИМХО, это намного чище, чем пытаться перепроектировать решение на основе привязок.