gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:26:31 25 4
gpt4 key购买 nike

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

我想要一个 NSTokenField 来“表示”核心数据应用程序中的关系。前提是这样的:您单击 TableView 中的注释(从注释数组 Controller 加载)。然后,标记字段(通过“值”)绑定(bind)到 Notes 数组 Controller 选择.Tags。标签是实体注释上的一对多关系。

显然,NSTokenField 不会接受数组 Controller 提供的 NSSet。为了解决这个问题,我对 NSTokenFieldCell 进行了子类化并重写了其 objectValuesetObjectValue: 方法。我认为我可以简单地将提供的 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 countByEnumerateWithState:objects:count:]:无法识别的选择器发送到实例...

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

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

更新:如果有影响的话,我没有为 TokenField 配置委托(delegate)。

最佳答案

以典型的 SO 方式,我找到了自己问题的答案。一开始就很愚蠢。我只需要另一个绑定(bind)到 Notes Selection.Tags 集的 ArrayController。然后,我将 NSTokenField 绑定(bind)到该 Controller 的 ArrangedObjects,实现了一些委托(delegate)方法。繁荣。简单。

我真傻。

关于objective-c - NSTokenFieldCell 子类强制使用核心数据对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com