代码之家  ›  专栏  ›  技术社区  ›  jhleath

nstokenfieldcell子类强制使用核心数据到多个关系

  •  1
  • jhleath  · 技术社区  · 15 年前

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

    我希望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配置委托。

    1 回复  |  直到 14 年前
        1
  •  0
  •   jhleath    15 年前

    以典型的方式,我找到了自己问题的答案。一开始是愚蠢的。我只需要另一个arraycontroller绑定到notes selection.tags集。然后,我将nstokenfield绑定到该控制器的arrangedObjects,实现了一些委托方法。繁荣。简单。

    愚蠢的我。

    推荐文章