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 之间有更好的分离。

有更好的想法吗?

4

1 回答 1

2

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

NSMenu / NSMenuItem 没有“选定项目”的概念,例如 NSPopUpButton。我会使用目标/操作机制来更改排序方法和菜单验证(用户界面验证简介)甚至 NSMenu 委托方法 -menu:updateItem:atIndex:shouldCancel:(NSMenuDelegate 协议参考)来更新项目基于 -taskSortMethod 的结果。

由于菜单项仅在显示时才需要更新(此机制为您服务),因此您不必担心在 -taskSortMethod 其他地方发生更改时自己更新菜单项。

前任:

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

IMO,这比试图过度设计绑定驱动的解决方案要干净得多。

于 2009-11-04T21:01:00.423 回答