문제

내 응용 프로그램에서 나는 매우 간단한 바인딩을 만들었습니다. NSMUTABLEARRAY가 NSARRAYCONTROLLER에 바인딩했습니다. 컨트롤러 자체는 Combobox에 묶여 있으며 NSMutableArray의 모든 내용을 보여줍니다. 잘 작동합니다.

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

그러나 nsmutablearray <-> nsarraycontroller <-> nscombobox의 바인딩은 새로 고침되지 않습니다.

배열에서 모든 객체를 제거하더라도 Combobox는 여전히 동일한 항목을 보여줍니다.

여기서 무엇이 잘못 되었습니까? 내 접근 방식이 잘못 되었습니까? 나는 그렇게하는 방법을 찾지 못했습니다.

도움이 되었습니까?

해결책

KVO 메커니즘을 전복시키는 "컨트롤러 뒷면의 배열 편집"가능성이 있습니다.

당신은 말했습니다 :

NSMUTABLEARRAY가 NSARRAYCONTROLLER에 바인딩했습니다.

어떻게? 배열은 어디에 살고 있습니까? 문서에서 KVC / KVO 준수 -MyArray / -setmyArray : 액세서 세트를 통해 액세스 할 수 있습니까?

"myArray"ivar를 -removeallobjects에 직접 말할 것입니다. 이 KVC/KVO 액세서는 어레이를 어떻게 "알고"알 수 있습니까?

대답은 그렇지 않습니다. 전체 배열을 실제로 교체하고 있다면 문서 (또는 배열을 소유 한 사람)를 -SetMyArray : 완전히 새로운 배열로 알려주는 것입니다. 이것은 적절한 KVO 호출을 유발합니다.

...하지만, 당신은 정말로 변한 배열이 필요하지 않습니까? 배열의 개별 품목 만 교체하려면 색인 액세서를 사용하려고합니다.

(문서화 - To -Many Properties 섹션의 컬렉션 액세서 패턴 참조)http://tinyurl.com/yb2zkr5

다른 팁

이것을 시도하십시오 (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가 컨텐츠를 업데이트하고 올바르게 표시해야합니다.

두 줄의 코드 솔루션은 다음과 같습니다.

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

첫 번째가 더 분명해 보이고 두 번째는 KVO와 비슷하다고 생각하십시오.

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

신자

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