코코아바인딩 :: 컨트롤러의 컨텐츠 제공방법

컨트롤러 컨텐츠를 제공하기

컨트롤러들은 (당연히도) 관리할 컨텐츠가 필요하며, 컨텐츠를 지정하는 방법에는 여러가지가 있다. 바인딩을 생성하는 코드를 통해서도 가능하며, IB를 통해서도 설정할 수 있다.

컨트롤러 컨텐츠 설정하기

NSObjectController와 그 서브클래스들은 -initWithContent:를 통해서 초기화되며, 만약 컨텐츠 바인딩을 의도한다면 nil을 넘겨도 된다. 혹은 명시적으로 setContent:를 통해서 지정해줄 수도 있다. 보통은 컨트롤러의 컨텐츠 바인딩을 통해서 연결하는 것이 일반적이다.

NSObjectControllercontentObject라는 단일 바인딩을 노출한다. 이 contentObject에 대해서 다른 객체를 바인드하여 컨텐츠를 만들 수 있다. 집합 컨트롤러들은 contentArray, contentSet, contentArrayForMultipleSelection 등의 키를 노출한다.

contentArray 바인딩은 NSArray나 인덱스단위로 액세스할 수 있는 접근자를 구현한 다른 객체에 바인딩된다. contentArrayForMultipleSelectioncontentArraycontentSet 바인딩이 복수 마커를 리턴할 때 폴백으로 쓰인다. 이는 주로 마스터-디테일 스타일의 인터페이스를 만들 때 쓰인다.

예를 들어 아래 그림은 마스터-디테일 스타일의 예인데, contentArrayForMultipleSelection의 적용 여부에 따른 마스터 컨트롤러의 복수 선택 처리를 표시한다.

1

디테일 배열 컨트롤러의 contentArray 키패스는 마스터 컨트롤러의 "selection.members"에 바인딩되고, 디테일 뷰의 value 칼럼은 디테일 배열 컨트롤러의 arrangedObjects.name에 바인딩된다. 이때 디테일 컨트롤러의 컨트롤러 키패스가 contentArrayforMultipleSelection이고 이것이 마스터 컨트롤러의 selection.@distinctUnionArrays.members에 바인딩되어 있다면, 복수 선택이 일어나는 경우, 중복을 제거한 선수이름만을 가져올 수 있게 된다.

컨트롤러 컨텐츠의 클래스를 지정하기

컨트롤러는 뷰의 타깃 액션 등을 통해서 새 데이터 객체를 만들 있다. 이 때 기본적으로 NSMutableDictionary가 사용되는데, (지금까지 예에서 보아왔듯이) 별도의 클래스를 사용하는 경에는 setObjectClass:를 이용해서 생성되는 객체의 클래스를 정해줄 수 있다. 만약 컨트롤러가 엔티티모드(코어데이터와 연동하는 모드)라면 setEntityName:을 통해서 엔티티 이름 문자열로 지정할 수 있다.

자동으로 컨텐츠를 준비하기

컨트롤러는 nib 파일에서 로드되면 자동으로 prepareContent 메시지를 받게되고, 이를 통해서 별도 처리 없이 컨텐츠를 로드할 수 있다. (만약 따로 지정되지 않는다면 빈 NSMutableDictionary 객체가 준비된다.) 비슷하게 NSArrayController의 경우, 로드될 때 NSMutableArray를 준비한다. 컨트롤러가 엔티티 모드로 동작하는 경우, 컨트롤러는 자동으로 해당되는 엔티티의 정보를 페칭한 후, 컨트롤러의 설정된 필터값에 따라 필터링하게 된다.