열거 된 특성을 바인딩하는 가장 깨끗한 방법은 무엇입니까?
-
16-09-2019 - |
문제
열거의 각 값에 대한 항목이있는 메뉴가 있습니다.
메뉴:
[ ] 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, 이것은 바인딩 구동 솔루션을 과도하게 엔지니어링하는 것보다 훨씬 깨끗합니다.