我遇到了一個有趣的難題(當然,我可能只是在做一些可怕的錯誤)。NSTokenFieldCell子類強制使用核心數據對多關係
我想NSTokenField在覈心數據應用程序中「表示」關係。前提是:您單擊TableView中的Note(從Notes Array控制器加載)。然後將令牌字段(通過「值」)綁定到Notes數組控制器選擇。標記。標籤是實體Notes中的一對多關係。
顯然,NSTokenField不會接受陣列控制器提供的NSSet。爲了解決這個問題,我將NSTokenFieldCell分類並取代了它的objectValue
和setObjectValue:
方法。我認爲我可以簡單地翻譯提供給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配置的委託。
你可以發佈代碼示例嗎?強制NSTextField與CoreData一起工作是一個有趣的主題...... – Gobra 2011-01-14 21:39:18