2010-07-25 64 views
1

我遇到了一個有趣的難題(當然,我可能只是在做一些可怕的錯誤)。NSTokenFieldCell子類強制使用核心數據對多關係

我想NSTokenField在覈心數據應用程序中「表示」關係。前提是:您單擊TableView中的Note(從Notes Array控制器加載)。然後將令牌字段(通過「值」)綁定到Notes數組控制器選擇。標記。標籤是實體Notes中的一對多關係。

顯然,NSTokenField不會接受陣列控制器提供的NSSet。爲了解決這個問題,我將NSTokenFieldCell分類並取代了它的objectValuesetObjectValue:方法。我認爲我可以簡單地翻譯提供給NSTokenFieldCell預期的NSArray的NSSet。 (注:我最初試圖重寫一個子類NSTokenField這些方法,但是,他們沒有被調用)

所以,我想出了說代碼:

- (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文件,並給予一註標記,它顯示正確,並且[super setObjectValue:]傳遞了一串字符串。但是,一旦我輸入了其他內容並將鼠標移開,我就會收到錯誤信息

我不知道該怎麼辦。什麼可怕的錯誤呢?謝謝。

更新: 如果它有所作爲,我沒有爲TokenField配置的委託。

回答

0

在典型的SO時尚中,我找到了自己問題的答案。開始的時候很愚蠢。我只需要綁定到Notes選擇的另一個ArrayController.Tags設置。然後,我將NSTokenField綁定到該控制器的ArrangedObjects,實現了一些委託方法。繁榮。簡單。

傻我。

+0

你可以發佈代碼示例嗎?強制NSTextField與CoreData一起工作是一個有趣的主題...... – Gobra 2011-01-14 21:39:18