绑定枚举属性最简洁的方法是什么?

时间:2009-11-04 20:33:53

标签: cocoa cocoa-bindings binding nsmenu nsmenuitem

我有一个菜单,其中包含枚举中每个值的项目。

菜单:

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

最简洁的方法是什么?我有两个想法,但都让我感到不满意。

第一个想法:为每个值(sortMethodIsDueDatesetSortMethodIsDueDate:等创建属性)这些属性将调用setTaskSortMethod:并调用valueDidChange:@"sortMethodIsDueDate"等。然后菜单项将绑定到这些属性。这似乎做了很多工作。

第二个想法:将每个菜单项连接到-(IBAction)updateSortMethod:(id)sender,然后可以迭代菜单项并根据sender设置值。这种方法很好,直到taskSortMethod被代码的不同部分更改,此时需要添加代码以使菜单与taskSortMethod保持同步。

我倾向于采用第一种方法,因为它更好地分离了V&下进行。

有更好的想法吗?

1 个答案:

答案 0 :(得分:2)

我认为你的第二个想法是正确的,但有一些事情需要考虑:

NSMenu / NSMenuItem没有“选定项目”的概念,例如NSPopUpButton。我将使用目标/操作机制来更改排序方法和菜单验证(Introduction to User Interface Validation)甚至NSMenu委托方法-menu:updateItem:atIndex:shouldCancel:(NSMenuDelegate Protocol Reference)来更新状态基于-taskSortMethod的结果的项目。

由于菜单项只有在显示时才需要更新(这个机制适合你),你不必担心在-taskSortMethod在其他地方更改时自己更新菜单项。

例如:

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

IMO,这比尝试过度设计绑定驱动的解决方案要清晰得多。