Wireframe

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

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

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

컨트롤러 컨텐츠 설정하기

NSObjectController와 그 서브클래스들은 -initWithContent:를 통해서 초기화되며, 만약 컨텐츠 바인딩을 의도한다면 nil을 넘겨도 된다. 혹은 명시적으로 setContent:를 통해서 지정해줄 수도 있다. 보통은 컨트롤러의 컨텐츠 바인딩을 통해서 연결하는 것이 일반적이다.
NSObjectControllercontentObject라는 단일 바인딩을 노출한다. 이 contentObject에 대해서 다른 객체를 바인드하여 컨텐츠를 만들 수 있다. 집합 컨트롤러들은 contentArray, contentSet, contentArrayForMultipleSelection 등의 키를 노출한다.
contentArray 바인딩은 NSArray나 인덱스단위로 액세스할 수 있는 접근자를 구현한 다른 객체에 바인딩된다. contentArrayForMultipleSelectioncontentArraycontentSet 바인딩이 복수 마커를 리턴할 때 폴백으로 쓰인다. 이는 주로 마스터-디테일 스타일의 인터페이스를 만들 때 쓰인다.
예를 들어 아래 그림은 마스터-디테일 스타일의 예인데, contentArrayForMultipleSelection의 적용 여부에 따른 마스터 컨트롤러의 복수 선택 처리를 표시한다.

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

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

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

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

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

Exit mobile version