2012-11-08 2 views
0

아래에 표시된 NSString * fileName 및 NSDictionary * 프레임의 두 속성을 가진 클래스가 있습니다.NSDictionary 하위 사전 값을 Cocoa에서 어떻게 바인딩 할 수 있습니까?

  • 있는 NSDictionary *는
    • 키 프레임 :있는 NSString
    • 값 :의 NSNumber (C++ ENUM 값)
    • 값 : 필드 인스턴스
  • 있는 NSDictionary * 필드
    • 키의 사전 : NSValue (C++ 객체 포인터)

각 파일을 나열하는 NSTableView로 마스터 세부 정보보기를 만들고 싶습니다. fileName은 바인딩하기에 충분하지만 첫 번째 열의 모든 열이나 필드를 세부 정보보기의 필드와 하위 사전의 값에 바인딩하는 방법을 알아낼 수 없습니다.

어쨌든 나는 C++ 객체 메소드에 바인딩 할 수 없다고 생각합니다. 필드 하위 사전 값에 대한 사용자 지정 컨트롤러가 필요하다고 생각하고 있습니다. 커스텀 컨트롤러가 KVC를 준수하도록하여 enum 키로 필드 값에 액세스 할 수 있고, 사용중인 C++ 라이브러리에 따라 enum으로 정의 된 유형에 적합한 메소드를 호출 할 수 있습니까?

또는 각 필드의 데이터를 필드 사전의 값으로 저장해야합니까? GUI에서 값을 수정 한 후에는 어쨌든 사전을 처리하는 메소드를 실행해야합니다.이 시점에서 C++ 필드 객체를 재구성하고 적절한 메소드를 호출 할 수 있습니다.

상관없이 내 과제는 중첩 된 사전에 대한 바인딩을 알아내는 것입니다.

답변

0

각 필드의 데이터를 "필드"하위 사전의 값으로 저장하는 결과가 발생했습니다. 값에 바인딩 할 키 경로를 지정할 수 있다는 것을 알지 못했습니다.

예를 들어, 내 질문에 설명 된대로 NSDictionary "프레임"멤버가있는 개체 집합을 포함하는 NSArray "tracks"멤버가있는 클래스가 있습니다. "트랙"은 내 GUI에서 NSTableView에 바인딩 된 NSArrayController로 표시됩니다.

NSTableView 내에서 모델 키 경로 "objectValue.frames.key1.key2"를 사용하여 표 셀의 정적 텍스트를 표 셀보기에 바인딩 할 수 있습니다.

마찬가지로 마스터 세부보기의 세부 부분에서 NSArrayController에 텍스트 필드 셀을 바인드 할 수 있습니다. 컨트롤러 키는 "selection"이고 모델 키 경로는 "frames.key1.key2"입니다.

1

NSController와 친구들을 서브 클래 싱하는 것이 최선의 접근 방법은 아닙니다.

키/값 코딩, 모든 바인딩이 기반으로하는 API는 NSNumber (또는 다른 유형)가 아닌 NSString이되는 키/keyPath를 사용합니다. NSNumber 키를 사용하지 않고 NSString 키를 사용하도록 전환하면 훨씬 쉽게 찾을 수 있습니다. 문자열과 열거 형 값 사이를 앞뒤로 변환하는 switch 문을 사용하여 두 가지 함수를 구현하는 것만 큼 간단합니다.

당신은 이미 C++ 객체에 대한 포인터를 바인딩 할 수 없다는 것을 깨달았으므로 다음 논의에서는 값을 사전에 구운 것으로 가정합니다. 어떤 이유로 필드 사전에서 NSString 키를 사용하도록 전환 할 수없는 경우 NS [Mutable] 사전을 서브 클래스 화하고 -valueForUndefinedKey:-setValue:forUndefinedKey:을 재정 의하여이 변환을 수행 할 수 있습니다. 서브 클래 싱하는 NS [Mutable] Dictionary는 그 클래스가 클래스 클러스터에 의해 뒷받침된다는 사실을 염두에 두지 않습니다. 문서는 하위 클래스의 모든 요구 사항을 명확하게 열거하므로 여기서는 다루지 않을 것입니다. 또한 -setObject:forKey: 구현에서는 NSNumber 키를 사용하여 수정 한 문자열 키에 대해 -willChangeValueForKey:-didChangeValueForKey: 알림을 보내야합니다.

이 모든 것을 std::hash_map<enum, ptr> 또는 다른 C++ 클래스/구조체에 저장하는 것이 좋다고 가정하면 Objective-C에 연결하는 논리적 인 접근 방식은 STL hash_map을 래핑하고 KVC/위에서 설명한 것과 유사하게 NSString 키를 사용하여 KVO 의미론을 처리합니다.

+0

나는 내 질문을 게시 한 후 NSString 대 NSNumbers 것을 알아 냈습니다. 마지막으로 각 필드의 데이터를 하위 사전의 값으로 저장하는 마지막 제안으로 끝 맺었습니다. 지금은 어떤 컨트롤러 객체를 사용할 것인지, 뷰에 링크하는 방법, 올바른 키로 뷰를 구성하는 방법 등을 파악하는 것만으로도 충분하다고 생각합니다. – Matt