2009-11-04 3 views
2

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

Меню:

[ ] 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; 

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

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

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

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

Все лучшие идеи?

ответ

2

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

NSMenu/NSMenuItem не имеют понятия «выбранного элемента», как, например, NSPopUpButton. Я бы использовал механизм target/action для изменения метода сортировки и проверки меню (Introduction to User Interface Validation) или даже метода делегирования NSMenu -menu: updateItem: atIndex: shouldCancel: (NSMenuDelegate Protocol Reference) для обновления состояния элемента на основе результата -taskSortMethod.

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

Ex:

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

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

+0

Я пошел со вторым подходом. Я думаю, что в следующий раз, когда эта проблема возникнет, я создам класс для его решения. Я удивлен, что нет более элегантного решения. –

 Смежные вопросы

  • Нет связанных вопросов^_^