2010-07-25 4 views
1

나는 흥미로운 수수께끼를 보았습니다 (당연히, 나는 끔찍한 잘못을 저지르고있을 수도 있습니다).NSTokenFieldCell 핵심 데이터 다차원 관계 사용을 강제하는 서브 클래스

NSTokenField가 핵심 데이터 응용 프로그램에서 관계를 "표현"하고 싶습니다. 전제는 다음과 같습니다 : Notes 배열 컨트롤러에서로드 된 TableView에서 Note를 클릭합니다. 토큰 필드는 Notes 어레이 컨트롤러 선택 항목에 바운드됩니다 ("값"을 통해). 태그는 엔티티 Notes에서 일대 다 관계입니다.

분명히 NSTokenField는 어레이 컨트롤러가 제공하는 NSSet을 허용하지 않습니다. 이 문제를 해결하기 위해 NSTokenFieldCell을 서브 클래 싱하여 objectValuesetObjectValue: 메소드를 오버라이드했습니다. NSTokenFieldCell이 예상 한 NSArray에 제공된 NSSet을 단순히 변환 할 수 있다고 생각했습니다. (참고 :. 내가 원래 NSTokenField 서브 클래스에서이 메소드를 오버라이드 (override) 시도하지만, 그들이 호출되는되지 않은) :

- (void)setObjectValue:(NSSet*)object { 
    tagsList = [object copy]; 
    NSMutableArray *displayList = [[NSMutableArray alloc] init]; 
    for (id newObject in tagsList) { 
     [displayList addObject:[newObject valueForKey:@"Name"]]; 
    } 
    [super setObjectValue:displayList]; 
} 

- (id)objectValue { 
    NSArray *displayList = [super objectValue]; 
    NSEntityDescription *tagEntity = [NSEntityDescription 
           entityForName:@"Tag" 
           inManagedObjectContext:[appDelegate 
                 managedObjectContext]]; 
    NSMutableSet *returnValue = [[NSMutableSet alloc] init]; 
    for (NSString *token in displayList) { 
     NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
     [request setEntity:tagEntity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat: 
            @"Name == %@", token]; 
     [request setPredicate:predicate]; 

     NSError *error; 
     NSArray *results = [[appDelegate managedObjectContext] executeFetchRequest:request error:&error]; 
     if (results == nil) { 
      NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:[appDelegate managedObjectContext]]; 
      [object setValue:token forKey:@"Name"]; 
      [returnValue addObject:object]; 
     } else { 
      [returnValue addObject:[results objectAtIndex:0]]; 
     } 
    } 
    return returnValue; 
} 

그것은 충돌

그래서 생각 해낸 코드가 말했다. :(그리고, 놀랍게도 그것은 [super objectValue]를 호출하는 라인에 충돌 그것은 나에게 오류 제공합니다..

-[NSConcreteAttributedString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance ...

한숨을 슬픈 일입니다 내가 코어 데이터 XML 파일로 가서 참고 a를 줄 때 태그가 올바르게 표시되고 [super setObjectValue:]이 문자열 배열을 전달하지만 다른 곳으로 마우스를 가져 가면 오류가 발생합니다.

나는 이것에 대해 어떻게해야할지 모르겠다. 끔찍한 일이라도 되니? 고마워.

업데이트 : 차이가 나는 경우 TokenField에 대해 구성된 대리인이 없습니다.

답변

0

일반적인 SO 방식에서 나는 내 자신의 질문에 대한 답을 찾았습니다. 그것은 어리석은 것으로 시작되었습니다. Notes selection.Tags 세트에 바인딩 된 또 다른 ArrayController가 필요했습니다. 그런 다음 NSTokenField를 해당 컨트롤러의 ArrangedObjects에 바인딩하고 일부 대리자 메서드를 구현했습니다. 팔. 단순한.

어리석은 나를.

+0

코드 샘플을 게시 할 수 있습니까? NSTextField가 CoreData와 작동하도록 강제하는 것은 흥미로운 주제입니다 ... – Gobra