我遇到了一个有趣的难题(当然,我可能只是做了一些可怕的错误)。
我希望nstokenfield在核心数据应用程序中“表示”关系。前提是:从表视图(从Notes数组控制器加载)中单击一个注释。然后,令牌字段(通过“value”)绑定到Notes数组控制器selection.tags。标记是实体注释上的一对多关系。
显然,nstokenfield不会接受阵列控制器提供的nsset。为了解决这个问题,我将nstokenfieldcell子类化,并超越了它
objectValue
和
setObjectValue:
方法。我想我可以简单地翻译NSET,它提供给NSARRAY,NSTOKENFieldCell希望如此。(注意:我最初尝试在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配置委托。