1

我遇到了一个有趣的难题(当然,我可能只是在做一些非常错误的事情)。

我想要一个 NSTokenField 来“代表”核心数据应用程序中的关系。前提是:您从 TableView(从 Notes Array Controller 加载)中单击注释。然后将令牌字段(通过“值”)绑定到 Notes Array Controller selection.Tags。标签是实体 Notes 上的一对多关系。

显然,一个 NSTokenField 不会接受 Array Controller 提供给它的 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 ...

叹。可悲的是,当我进入 Core Data XML 文件并给 Note 一个标签时,它正确显示,并[super setObjectValue:]传递了一个字符串数组。但是,一旦我输入其他内容并将鼠标移开,就会出现错误。

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

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

4

1 回答 1

0

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

傻我。

于 2010-07-25T22:45:16.740 回答