是否可以使用 cocoa 绑定与 NSTableView 和多对多关系

Is it possible to use cocoa bindings with NSTableView and Many-to-Many relationships

我想知道是否可以使用 cocoa 绑定来显示 NSTableView 行上的一对多或多对多关系。

我想做的是每行显示一个实体,在一列中我想通过关系显示来自另一个实体的多个属性。

目前我的架构是这样的:

人物 <--->> 标签

一行应如下所示:

Name | Birth   | Address    | tag
--------------------------------------------------------
jon   75/12/13   123 street   handyman, contractor
paul  53/03/20   53 avenue 1  contractor, swimmer, biologist

这可能吗?

有几种方法可以做到这一点。出于讨论的目的,我假设一个集合 属性 tags 用于一对多关系。

你可以做一个依赖属性这是标签列表字符串:

+ (NSSet*)keyPathsForValuesAffectingTagList
{
    return [NSSet setWithObject:@"tags"];
}
- (NSString*) tagList
{
    return [[self.tags sortedArrayUsingSelector:@selector(localizedStandardCompare:)] componentsJoinedByString:@", "];
}

(如果 tags 是一个集合而不是数组,您将使用 self.tags.allObjects。)

由于这在某种程度上特定于标签列表在视图中的呈现方式,因此可以将其视为视图层而不是模型层的更多部分。因此,您可以在 class 的类别中定义这些方法,而不是 class 本身。

另一种方法是使用值转换器来做同样的事情class。您将文本字段绑定到 tags 集合 属性,但指定自定义值转换器的名称 class。 class 将从集合 class(数组或集合)转换并以类似于上述的方式生成字符串。

@interface TagListTransformer : NSValueTransformer {}
@end

@implementation TagListTransformer

+ (Class) transformedValueClass
{
    return [NSString class];
}

+ (BOOL) allowsReverseTransformation
{
    return NO;
}

- (id) transformedValue:(id)value
{
    return [[value sortedArrayUsingSelector:@selector(localizedStandardCompare:)] componentsJoinedByString:@", "];
}

@end