是否可以将Cocoa绑定与NSTableView和多对多关系一起使用

时间:2016-12-18 20:30:38

标签: objective-c cocoa interface-builder nstableview cocoa-bindings

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

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

目前我的架构是这样的:

人< --->>标签

一行应如下所示:

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

甚至可能吗?

1 个答案:

答案 0 :(得分:3)

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

您可以创建一个依赖属性,它是标记列表字符串:

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

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

由于这特定于标记列表在视图中的显示方式,因此可以将其视为视图层的一部分而不是模型层。因此,您可以在类的类别中定义这些方法,而不是类本身。

另一种方法是使用值转换器类执行相同的操作。您将文本字段绑定到tags集合属性,但指定自定义值转换器类的名称。该类将从集合类(数组或集合)转换,并以与上述类似的方式生成字符串。

@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