2013-02-25 3 views
10

NSArrayController의 내용을 정렬 된 일대 다 관계의 엔터티에 어떻게 바인딩합니까?NSArrayController와 순서가 지정된 관계 바인딩하기

필자는 Core Data 모델에서 비 순차적 일대 다 관계를 가지고 있으며, NSArrayController는 부모 엔티티에서 그 관계에 바인드 된 컨텐츠 세트를 가지고 있습니다. 이것은 잘 작동, NSArrayController에서 아무런 문제없이 데이터에 액세스 할 수 있습니다.

개발 중에 사용자가 이러한 하위 개체를 수동으로 순서를 재지 정하는 것이 좋을 것이라고 결정 했으므로 관계를 순서가 변경된 것으로 변경했습니다. 내 NSArrayController가 내 펜촉에서 생성 될 때 이제 다음과 같은 오류가 표시됩니다 : 그것은 순서 관계, 그래서 지금은 정렬 된 집합을 받고 있어요 :

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

지금 실제로, 나는이 모든 말이 생각합니다. Content Array에 바인딩하는 것은 부적절합니다. 배열이 아닌 NSOrderedSet 이니까요. 내 질문 : 이제이 관계의 데이터를 NSArrayController에 어떻게 다시 바인딩합니까?

+0

나는이 문제를 겪었으며 이것이 NSArrayController와 관련된 버그라고 확신한다. 버그 보고서를 제출했다. – Vervious

+0

Hal의 대답에서 인용 한 해결 방법에 따르면, 실제로 아무도 그것을 바인딩 할 "진정한"방법이없는 것으로 보입니다. 나는 IMO가 showstopper, 해결 방법이되어야하거나 그렇지 않아야하기 때문에 버그 보고서도 만들 것이다. – Khakionion

답변

8

근본적인 문제는 코어 데이터 순서 대다 관계가 NSOrderedSet을 리턴하고 NSOrderedSet이 NSSet의 서브 클래스가 아니라는 점입니다. NSSet을 예상하는 모든 어레이 컨트롤러 바인딩은 실패합니다.

Tom Fewster는 NSValueTransformer를 사용하여이 단점을 해결하고 NSOrderedSet과 NSArray를 즉시 변환하는 방법을 설명하는 detailed blog post을 가지고 있습니다. 그는 또한 sample implementation on Github을 제공합니다.

+0

감사합니다. 질문의 마지막 단락에서 지적했듯이, NSSet의 상속 (현재의 부족)은 바인딩의 문제점이 현재 존재한다는 것을 알고 있습니다. 그러나이 가치 변압기 접근법은 생명의 은인입니다! 나는 그것을 살펴볼 것입니다. – Khakionion

+3

해결 방법의 문제점은 변경할 수있는 접근자가 사용되지 않는다는 것입니다. 즉, 모든 변경은 전체 집합을 재 할당/재 변환한다는 것을 의미합니다. – Vervious

9

이 토론에 새로운 발전이 있었는지 알아보기 위해이 토론을 보았습니다. 배송 응용 프로그램에서 나는 현재 배열 컨트롤러의 콘텐츠 배열을 [email protected]에 바인딩합니다. 그리고 나 자신이나 다른 누군가가 어딘가에 제안했는지는 알 수 없습니다.

+0

이것은 분명히 해결책입니다. – Altimac

+2

"array"연산자가 NSOrderSet의 "array"메쏘드를 호출하기 때문에 이것이 해결책이라고 확신하지 않습니다. NSOrderSet.h의 header-file 문서를보십시오.). 이것은 NSArrayController가 "bind"할 수는 있지만 NSOrderedSet을 변경하지 못한다는 것을 의미합니다. 이것은 반쪽 결속에 불과합니다. 읽기 전용 솔루션. –

+0

사실 참으로 사실입니다. 가변성이 필요하다면 실패 할 것입니다. 좋은 캐치;) – Altimac

관련 문제