0

코어 데이터 저장소의 데이터를 표시하는 NSOutlineView가 있습니다. 데이터는 managedObjectContext에 링크 된 NSarrayController를 사용하여 표시되며 NSTreeController를 사용하여 NSOutlineView에 표시됩니다 (많이 설명 된 내용은 here). NSPredicate (또는 다른 것)를 사용하여 표시되는 데이터를 필터링하고 싶습니다. 그러나이를 작동시키지 못합니다. 이것은 NSFetchedResultsController를 사용할 수 없기 때문에 iOS가 아닌 OSX입니다.arrayController 및 코어 데이터에 대한 술어 사용 방법

올바른 데이터를 검색하여 NSArray에 저장할 수 있습니다. 그러나 필터링 된 데이터 만 사용하여 내 outlineview에서 볼 수있는 내용을 자동으로 업데이트 할 수는 없습니다. 당신은 내 질문이 one 가까이에서 볼 수 있듯이

[arrayController setManagedObjectContext:_coreDataHelper.context]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SDRDFileObject" 
              inManagedObjectContext:_coreDataHelper.context]; 

[request setEntity:entity]; 

NSNumber *directionLimit = @1; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"direction = %@", directionLimit]; 
[request setPredicate:predicate]; 

NSError *error; 
[arrayController setContent:[_coreDataHelper.context executeFetchRequest:request error:&error]]; 

[_coreDataHelper.context reset]; 
[arrayController fetch:self]; 
[outlineView reloadData]; 

,하지만 난 여전히 고군분투하고있다 : 이것은 내가 현재 가지고있는 것입니다. arrayController에 대해 setContent를 사용하여이 작업을 수행하면 코어 데이터 컨텍스트와 arrayController의 내용이 일치하지 않는 문제가 발생한다고 가정합니다. 이 작업을 올바로 수행하는 방법에 대한 제안이나 예제는 크게 감사하겠습니다.

답변

1

제안 1 : 어레이 컨트롤러를 제거하십시오.

우리가 지시하는 첫 번째 링크 작성자의 목적은 무엇인지는 모르겠지만 적어도 가장 일반적인 NSOutlineView 설치에서 약간 이상합니다. 핵심 데이터에서 값을 추출하여 개요보기로 표시하는 데 필요한 유일한 컨트롤러 개체는 NSTreeController입니다. 튜토리얼에서는 배열 컨트롤러를 끼워 넣는 방법을 제안합니다. "NIB 파일에서 NSManagedObjectContext에 바인딩 된 배열 컨트롤러가 필요하며 Entity 모드로 설정되고 Pred Predicate with parent == nil이 필요합니다. 최상위 개체 - 부모가없는 엔티티 "제 의견으로는 트리 컨트롤러로 수행해야하는 것입니다 어레이 컨트롤러. 씬이 마음에 든다면, 먼저 트리 컨트롤러만으로 데이터가 올바르게 표시되도록해야합니다. 일단이 작업을 완료하면 아웃 라인보기를 필터링하는 것에 대해 생각할 수 있습니다.

제안 2 : 필터링 NSArrayController 달리

, NSTreeController 객체는 클래스 참조에는 filterPredicate이 없습니다. 왜 그런지 모르겠지만 개요보기에서는 필터링 동작을 직접 구현해야합니다. 조금 까다 롭지 만 어려운 일은 아닙니다. 예를 들어, 내 프로젝트 중 하나에서 왼쪽 아래 모서리에있는 검색 막대에 무언가를 입력 할 때 Xcode에서 파일을 필터링하는 방법을 유인하는 큰 드래그 앤 드롭 호환 트리 컨트롤러/개요보기 설정이 있습니다. 나는 NSTreeController-filterContentUsingPredicate이라는 범주를 추가하고 배열을 반환하여이 작업을 수행했습니다. 필터링이 완료되면 [-NSTreeController setContent:]로 전화하여 개요보기의 내용을 업데이트하여 필터를 반영합니다.

+0

고마워요! 당신은 내가 'NSArrayController'를 필요로하지 않는다는 것을 절대적으로 옳았습니다. 이제는 잘 작동하는 treecontroller 만 사용하게되었습니다. 당신이 제안했듯이, 나는 그것을하기를 원하는 방식으로 'NSTtreeController'를 필터링하는 재귀 함수를 구현했다. 그러나 각 노드와 부모를 동시에 비 순차적으로 통과하기 때문에 매우 느립니다. filterContentUsingPredicate 구현 방법에 대한 예제 코드가 있으면 크게 감사하겠습니다. 나는 당신의 대답을 받아 들일 것입니다. –

+0

제 필터링 절차가 당신 것보다 더 세련되지 않은 것처럼 들립니다. 나는 쓰레드를 사용하는 법을 배우는 것에 익숙하지 않았고, 광산 역시 트리의 모든 노드를 방문한다. 지금까지 나는 그것을 나의 목적을 위해 충분히 빨리 발견했다. 그래서 나는 더 정교한 해결책을 찾을 필요가 없다고 느꼈다. –

관련 문제