2009-10-26 2 views
3

매우 간단한 바인딩을 만들었습니다. 나는 NSArrayController에 바인딩 된 NSMutableArray를 가진다. 컨트롤러 자체는 ComboBox에 바인딩되어 NSMutableArray의 모든 내용을 표시합니다. 잘 작동합니다.Refresh Cocoa-Binding - NSArrayController - ComboBox 내 응용 프로그램에서

문제는 다음과 같습니다. 배열 내용이 변경됩니다. 사용자가 앱을 조정하면 NSMuteableArray의 모든 항목을 삭제하고 새롭고 다른 항목으로 채 웁니다.

그러나 NSMutableArray의 바인딩은 < -> NSArrayController < -> NSComboBox를 새로 고치지 않습니다.

배열에서 모든 개체를 제거하더라도 상관없이 ComboBox는 동일한 항목을 계속 표시합니다.

무엇이 잘못 되었나요? 내 접근 방식이 잘못 되었나요? 아니면 바인딩 자체에 새로 고침 만하면됩니까? 나는 그 일을하는 방법을 찾지 못했습니다.

답변

6

KVO 메커니즘을 파괴하는 "컨트롤러 뒷면의 배열 편집"가능성이 높습니다.

당신은 말했다 :

내가있는 NSMutableArray가 NSArrayController에 바인딩합니다.

어떻게? 배열은 어디에 있습니까? KVC/KVO를 준수하는 문서에서 액세스 할 수 있습니까? -myArray/-setMyArray : 접근 자의 집합입니까?

"myArray"ivar에 -removeAllObjects를 직접 말한 것입니다. 맞습니까? 이 KVC/KVO 접근자는 배열이 변경된 것을 어떻게 "알 것"입니까?

대답은 맞지 않습니다. 실제로 전체 배열을 대체하는 경우에는 문서 (또는 배열을 소유 한 사람)에게 -setMyArray :를 완전히 새로운 배열로 전달하고 싶을 것입니다. 그러면 적절한 KVO 호출이 실행됩니다.

... 그렇다면 가변 배열이 필요하지 않습니까? 당신은 단지 배열의 개별 항목을 교환하려는 경우, 당신은 인덱스 접근을 사용하는 것이 좋습니다 :

(문서 -받는 사람 - 대부분의 속성 섹션에 대한 컬렉션 액세스 용 패턴 참조) http://tinyurl.com/yb2zkr5

+3

ArrayController 및 메시지 rearrangeObjects에 대한 콘센트의 문제점을 수정했습니다. 이 방법은 내가 combobox에 업데이트 된 배열을했습니다. – TalkingCode

+0

니스, 나는 단지 똑같이했고 그것은 나를 위해 멋지게 일했다. –

0

KVC/KVO 준수 문제가되는 것 같습니다. 생성 된 접근 자 메서드를 사용하여 새 배열을 만들고 새 객체로 참조를 업데이트해야합니다. 그렇지 않으면 배열의 내용이 변경되었음을 알리기 위해 업데이트되는 배열에 대한 KVO 메시지를 실행할 수 있습니다.

기독교

1

는 시도이 (사용 ARC/OS X 10.7) :

헤더 파일

, 구현에 arrayInstance과 arrayController 다음

@property (weak) IBOutlet NSArrayController *arrayController; 
@property (strong) NSArray *arrayInstance; // for the array instance 

을 정의

@synthesize arrayController = _arrayController; 
@synthesize arrayInstance = _arrayInstance; 

_arrayInstance = ....... // What ever the new array will be 
[_arrayController setContent:_arrayInstance]; 

이렇게하면 arrayController가 내용을 업데이트하고 cor 곧장.코드 솔루션의

또 다른 있지만,이 라인은 다음과 같습니다

[self willChangeValueForKey:@"arrayInstance"]; 
_arrayInstance = ....... // What ever the new array will be 
[self didChangeValueForKey:@"arrayInstance"]; 

는, 최초의 외모 더 분명 두 번째 더 KVO 같은 생각.