문제

열거의 각 값에 대한 항목이있는 메뉴가 있습니다.

메뉴:

[ ] 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 사이의 분리가 더 좋기 때문에 첫 번째 접근 방식에 기대고 있습니다.

더 나은 아이디어가 있습니까?

도움이 되었습니까?

해결책

두 번째 아이디어로 올바른 길을 가고 있다고 생각하지만 고려해야 할 사항이 있습니다.

NSMENU / NSMENUITEM에는 NSPOPUPBUTTON과 같은 "선택된 항목"이라는 개념이 없습니다. 목표/액션 메커니즘을 사용하여 정렬 방법 및 메뉴 검증을 변경합니다 (사용자 인터페이스 검증 소개) 또는 NSMENU 대의원 방법 -Menu : UpdateItem : atindex : whitcancel : (nsmenudelegate 프로토콜 참조) -TaskSortMethod의 결과를 기반으로 항목의 상태를 업데이트합니다.

메뉴 항목은 표시 될 때만 업데이트해야하므로 (이 메커니즘이 귀하를 위해 수행하는 경우) -TaskSortMethod가 다른 곳에서 변경할 때 메뉴 항목을 직접 업데이트하는 것에 대해 걱정할 필요가 없습니다.

전:

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

IMO, 이것은 바인딩 구동 솔루션을 과도하게 엔지니어링하는 것보다 훨씬 깨끗합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top