문제

서로 다른 XIB에 정의된 두 창에 하나의 NSArrayController의 내용을 표시하는 데 몇 가지 문제가 있습니다.

내 기본 창(MainMenu.xib)에는 NSArrayController에 바인딩된 NSTableView가 있습니다.

두 번째 XIB에는 NSTableView가 포함된 또 다른 창이 있습니다.새로운 NSArrayController를 생성하고 해당 NSArrayController의 내용에 테이블을 바인딩했습니다.

두 NSArrayController는 정확히 동일한 NSArray에 바인딩됩니다.

처음에는 모든 것이 괜찮지만 문제는 기본 창에서 NSArrayController를 사용하여 배열에 개체를 추가하면 보조 창의 데이터 보기가 업데이트되지 않는다는 것입니다.이는 NSArrayController가 새 개체를 추가하는 데 사용되지 않았기 때문에 자체 업데이트가 필요하다는 것을 모르기 때문일 가능성이 높습니다.

내가 하고 싶은 것은 두 창 모두에서 정확히 동일한 NSArrayController 인스턴스를 사용하는 것입니다.이렇게 하면 객체가 배열에 추가되면 두 뷰 모두에 변경 사항이 통보됩니다.

문제는 Interface Builder에서 이 작업을 수행하는 방법을 알 수 없다는 것입니다.NSArrayController를 다른 NSArrayController에 바인딩할 수 없습니다(NSArray에만 바인딩할 수 있다는 런타임 오류가 발생합니다).NSArrayController를 File's Owner의 NSArrayController 멤버에 연결하는 것도 도움이 되지 않습니다. 왜냐하면 그렇게 하면 사용하려는 NSArrayController가 지워지기 때문입니다.

바인딩은 코드에서 직접 설정할 수도 있겠지만, 가능하다면 Interface Builder를 사용하는 것이 더 좋을 것 같습니다.Interface Builder에서 이 작업을 수행할 수 있는 방법이 있습니까, 아니면 이 모든 것을 함께 설정하는 더 좋은 방법이 있습니까?

업데이트: Chuck의 답변과 의견에 따라 다음을 시도했습니다.- 내 NSTableView의 테이블 콘텐츠를 NSArrayController 멤버의 배열된 개체에 바인딩합니다. (NSArrayController 자체를 사용한 경우 로그에 오류가 나타납니다."[NSArrayController 수]:인스턴스로 전송되지 않은 선택기 ") -테이블의 각 열 바운드는 arraycontroller.arrangedObjects.propertyName의 모델 키 경로와 함께 파일 소유자에게 테이블의 각 열

그래도 테이블 내용이 업데이트되지 않았습니다.나는 이것이 NSArrayController 자체가 아닌 NSArrayController의 배열된 개체에 바인딩하고 있기 때문이라고 생각합니다.그러나 NSArrayController에 직접 바인딩하면 오류가 발생합니다.

일반적으로 저는 "Bind to" ComboBox에서 NSArrayController를 선택하고, arrayObjects를 컨트롤러 키로 사용하고, 속성 자체를 모델 키 경로로 사용합니다.이 경우에 해당하는 작업을 수행하는 방법을 잘 모르겠습니다. 가능하다면 말입니다.

위 과정에서 제가 뭔가 잘못한 걸까요?

도움이 되었습니까?

해결책

제가 생각해낸 최선의 선택은 두 번째 사람에게 알리는 것입니다. NSArrayController 관리하는 배열이 다음을 호출하여 변경되었음을 나타냅니다. rearrangeObjects: 그 위에.투박해 보이지만 작동합니다.

다른 팁

IB에서 프록시 개체로 설정한 다음 앱 대리자에서 실제 코드를 인스턴스화하는 것은 어떻습니까?

배열이 추가되면 KVO를 통해 두 NSArrayController를 모두 업데이트할 수 있습니다.요령은 KVO 호환 방식으로 어레이를 관찰하고 추가해야 한다는 것입니다.

배열을 소유하는 개체가 필요합니다. 이를 "모델"이라고 부르겠습니다.배열은 객체의 키여야 합니다. 키를 "contentArray"라고 부르겠습니다.다음으로 추가/제거할 때 먼저 "model"에서 mutableArrayForKey를 호출하여 "contentArray"를 가져와야 합니다.그러면 배열에서 추가/제거가 작동합니다. 예를 들면 다음과 같습니다.

Controller1은 self.model.contentArray에 바인딩되어 있습니다.

Controller2는 self.model.contentArray에 바인딩되어 있습니다.

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

또는 다음과 같이 KVO 알림을 수동으로 수행할 수 있습니다.

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

두 개의 어레이 컨트롤러가 있으면 다른 뷰를 통해 업데이트할 때 하나의 뷰가 업데이트되지 않도록 해야 할 이유가 없습니다.이런 일이 발생하지 않으면 KVO 알림이 어딘가에서 사라지는 것 같습니다.아마도 배열을 직접 편집하고 있을 가능성이 큽니다(NSArrayController 하위 클래스의 add: 아마도?) 적절한 변경 알림을 보내지 않은 채 말이죠.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top