2009-11-04 108 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

相關問題