2011-04-21 5 views
2

짧은 이야기 재설정되는 :NSArrayController 선택

NSArrayController의 선택의 setContent가 발행 될 때마다 재설정 중입니다. 나는 이것을 꺼 버리는 방법이 있는지 궁금합니다.

물론 이것은 NSArrayController가 내부 selectionIndexes를 사용하도록 허용하는 경우에만 허용되는 동작입니다. 둘 다 추적 할 수 없기 때문입니다. 그러나 selectionIndexes도 다시 연결되며이 부분은 문제없이 작동합니다. 그러나 여전히 선택을 재설정 할 필요가 있습니다.

업데이트 : 미운 해킹 솔루션은

나는 대답이 이동했습니다. 나는 또 다른 통찰력있는 대답을보기를 기뻐할 것이다.

긴 이야기 :

내가 (엑스 코드와 텍스트 편집기 소스 코드 선박을 모델) 문서 사이에 공유되는 관리자 패널 코코아 문서 기반의 응용 프로그램이 있습니다. Document 클래스에는 NSMutableArray와 NSMutableIndexSet이 NSArrayController에 대한 바인딩과 연결되어 있습니다.

인스펙터 패널은 별도의 nib 파일에 있으며 두 개의 동일한 NSArrayControllers, 주 문서 창과 인스펙터 패널의 두 개가있어 문서와 상호 작용할 수 있습니다. 이것이 selectionIndexes에 대한 수동 바인딩을하는 이유입니다. 그래서 두 개의 분리 된 NSArrayControllers로 두 개의 분리 된 선택을 가지지 않습니다.

검사기 패널 문서가 검사되고있는 추적 : 문서가 전환 될 때마다 갱신 또는 문서에는 전혀 포커스가 없다

Document *inspectedDocument; 

. NSObjectController는 최대 inspectedDocument에 연결되며, 앞서 언급 한 NSArrayController는 해당 컨트롤러에 연결됩니다.

이제 문제는 검사기 패널이 제 위치에 있고 inspectedDocument이 변경되면 선택 색인이 재설정된다는 것입니다. 관리자 패널을 사용하지 않으면 문제가 사라집니다. 따라서이 재설정을 실행하는 NSArrayController라고 가정합니다. 선택 영역에 바인딩하고이를 변경할 수있는 컨트롤이 없습니다 (예 : 테이블 뷰).

inspector 패널의 NSArrayController에서 "Empty Empty Selection"이 선택되어 있으면 선택 항목이 첫 번째 객체로 재설정되고, 그렇지 않으면 선택 항목이 재설정되므로 선택 항목이 올바르게 재설정됩니다. 사실, 관리자 패널이 선택 항목을 변경할 수 있기를 원하지 않기 때문에 NSArrayController의 선택 색인에 대해 읽기 전용 바인딩을 설정하고 싶습니다.

+0

당신이 전면에 짧은 버전을 이동 한 것을 감사하지만 여전히 약간의 밀도이다.지금까지 몇 번 읽었습니다. 콘텐트가 변경 될 때 어레이 컨트롤러의 선택이 바뀌고 원하지 않는다고 말하는 것 같습니다. 전혀 이해가되지 않습니다. 다른 콘텐츠에서 선택 사항을 어떻게 보존 할 수 있습니까? –

+0

선택 항목이 Document 클래스의 NSMutableIndexSet로 저장되기 때문에. 그래서 두 개의 문서는 분리 된 선택 인덱스를 가지고 있으며, 이들을 전환 할 때 이들을 보존하기를 원합니다. 미안해하는 것에 대해 유감스럽게 생각하면 설명하기 어려운 문제이며, 더 이해하면 개정하려고 노력할 것입니다. –

+0

알 수 있습니다. 그럴지도 모르지만 그 둘 사이의 연관성은 분명하지 않았습니다. 그것은 흥미로운 질문입니다. 사과 할 필요가 없다. 나는 단지 당신이 그것을 다시 고쳐야한다면 당신을 도울 수있는 명확하지 않은 것에 대한 의견이 당신을 도울 것 같다고 생각했습니다. –

답변

1

아직도 그 이유가 이해되지 않거나 해제 할 수 있지만 사용하고있는 솔루션이 매우 간단합니다. NSArrayController를 다시 배선하기 전에 선택 사항을 저장 한 다음 바로 복원하십시오.

이는 inspectedDocument가 변경 될 때 호출하고 선택을 재설정된다

NSIndexSet *indexSet = nil; 
if (inspectedDocument != doc) { 
    indexSet = [doc.selectedIndexes copy]; // Backup selection 
} 

[self setValue:doc forKey:@"inspectedDocument"]; // Selection is reset here 

if (indexSet) { 
    // The following function basically does doc.selectedIndexes = indexSet; 
    [inspectedDocument selectObjectsAtIndices:indexSet]; // Restore selection 
    [indexSet release]; 
} 
관련 문제