2009-11-04 102 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; 

什么是这样使用的清洁方法是什么?我有两个想法,但都让我感到不满意。

1想法:创建每个值(sortMethodIsDueDatesetSortMethodIsDueDate:等)性能这些属性会打电话setTaskSortMethod:和呼叫valueDidChange:@"sortMethodIsDueDate"等菜单项,然后将绑定到这些属性。这看起来很多工作。

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

我倾向于第一种方法,因为它具有在V & C.

更好的想法之间更好的分离?

回答

2

我认为你是在正确的轨道与你的第二个想法,但有一些考虑:

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

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

例:

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

IMO,这比尝试过设计一种绑定供电解决方案更清洁了很多。

+0

我已经走了第二种方法。我想下一次出现这个问题时,我会创建一个类来解决它。我很惊讶没有更优雅的解决方案。 – 2009-11-05 15:58:12

相关问题