首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制使用核心数据对多关系的NSTokenFieldCell子类

强制使用核心数据对多关系的NSTokenFieldCell子类
EN

Stack Overflow用户
提问于 2010-07-26 06:02:12
回答 1查看 599关注 0票数 1

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

我想要一个NSTokenField来“表示”核心数据应用程序中的关系。前提是:单击TableView中的Note (从Notes Array Controller加载)。然后,token字段被绑定(通过"value")到Notes Array Controller selection.Tags。标记是实体Notes上的一种多对多关系。

显然,NSTokenField不会接受数组控制器为其提供的NSSet。为了解决这个问题,我对NSTokenFieldCell进行了子类化并覆盖了它的objectValuesetObjectValue:方法。我认为我可以简单地转换提供给NSTokenFieldCell所期望的NSArray的NSSet。(注意:我最初尝试在NSTokenField子类上覆盖这些方法;但是,它们没有被调用。)

所以,我想出了这样的代码:

代码语言:javascript
复制
- (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配置委托。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-26 06:45:17

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

我真傻。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3331193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档