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

이를 연결할 수있는 깨끗한 방법은 무엇입니까? 나는 두 가지 아이디어를 가지고 있지만 불만족 스럽습니다.

첫번째 생각 : 이러한 속성은 setTaskSortMethod:를 호출 한 후 이러한 속성에 바인딩 할 valueDidChange:@"sortMethodIsDueDate" 등 메뉴 항목을 부를 것이다 각각의 값 (sortMethodIsDueDate, setSortMethodIsDueDate: 등)에 대한 속성을 만듭니다. 이것은 많은 일처럼 보입니다.

두 번째 아이디어 : 각 메뉴 항목을 -(IBAction)updateSortMethod:(id)sender에 연결하면 메뉴 항목을 반복하고 sender에 따라 값을 설정할 수 있습니다. 이 접근법은 taskSortMethod과 동기화 된 상태로 유지하기 위해 포인트 코드를 추가해야하는 다른 코드 섹션에 의해 taskSortMethod이 변경 될 때까지 문제가 없습니다. 는 V & C.

더 좋은 아이디어와 더 나은 분리를 가지고로

나는 첫 번째 방법으로 기울고 있어요?

답변

2

난 당신이 두 번째 아이디어와 올바른 궤도에 있다고 생각하지만, 고려해야 할 것이있다 :

NSMenu/NSMenuItem

는 예를 들어 NSPopUpButton처럼 "선택 항목"의 개념이없는가. 나는 (NSMenu 위임 메서드 - 메뉴 : updateItem : atIndex : shouldCancel : ( NSMenuDelegate Protocol Reference) 결과에 따라 항목의 상태를 업데이트하려면 정렬 방법 및 메뉴 유효성 검사 ( Introduction to User Interface Validation) 또는 NSMenu 대리자 메서드를 변경하려면 대상/동작 메커니즘을 사용하십시오. -taskSortMethod.

메뉴 항목은 표시 될 때만 업데이트하면되고 (이 메커니즘이 사용자를 대신하여 수행함), 다른 곳에서 -taskSortMethod가 변경 될 때 메뉴 항목을 직접 업데이트 할 필요가 없습니다.

예는 :

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

IMO, 이것은 바인딩 전원 솔루션을-엔지니어링을 통해하는 것보다 훨씬 청소기입니다.

+0

나는 두 번째 접근법을 따라갔습니다. 다음 번에이 문제가 생기면 그것을 해결할 수업을 만들 생각입니다. 나는 더 우아한 해결책이 없다는 것에 놀랐습니다. –