Objective c NSTokenFieldCell子类强制对多个关系使用核心数据

Objective c NSTokenFieldCell子类强制对多个关系使用核心数据,objective-c,cocoa,core-data,nstokenfield,Objective C,Cocoa,Core Data,Nstokenfield,我遇到了一个有趣的难题,当然,我可能只是在做一些可怕的错误 我希望NSTokenField表示核心数据应用程序中的关系。前提是:单击从Notes数组控制器加载的TableView中的注释。然后,令牌字段通过值绑定到Notes数组控制器selection.Tags。标记是实体注释上的多对多关系 显然,NSTokenField不会接受阵列控制器提供的NSSet。为了解决这个问题,我将NSTokenFieldCell子类化,并重写其objectValue和setObjectValue:methods。

我遇到了一个有趣的难题,当然,我可能只是在做一些可怕的错误

我希望NSTokenField表示核心数据应用程序中的关系。前提是:单击从Notes数组控制器加载的TableView中的注释。然后,令牌字段通过值绑定到Notes数组控制器selection.Tags。标记是实体注释上的多对多关系

显然,NSTokenField不会接受阵列控制器提供的NSSet。为了解决这个问题,我将NSTokenFieldCell子类化,并重写其objectValue和setObjectValue:methods。我认为我可以简单地将NSSet转换为NSTokenFieldCell所期望的NSArray。注意:我最初尝试在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:]:发送到实例的无法识别的选择器

唉。可悲的是,当我进入核心数据XML文件并给便笺添加一个标记时,它会正确显示,[super-setObjectValue:]会被传递一个字符串数组。然而,只要我输入其他内容并将鼠标移走,我就会得到错误

我不知道该怎么办。有人能发现这有什么可怕的错误吗?谢谢

更新:
如果有区别,我没有为TokenField配置委托。

以典型的SO方式,我找到了我自己问题的答案。一开始就很傻。我只需要另一个绑定到Notes selection.Tags集合的ArrayController。然后,我将NSTokenField绑定到该控制器的ArrangedObjects,实现了一些委托方法。繁荣简单


我真傻。

你能发布代码示例吗?强制NSTextField使用CoreData是一个有趣的主题。。。