我想知道是否可以使用 cocoa 绑定(bind)在 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
。)
由于这与标签列表在 View 中的呈现方式有关,因此可以将其视为 View 层而不是模型层的更多部分。因此,您可以在类的类别中定义这些方法,而不是在类本身中。
另一种方法是使用值转换器类来做同样的事情。您可以将文本字段绑定(bind)到 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
关于objective-c - 是否可以将 cocoa 绑定(bind)与 NSTableView 和多对多关系一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41212569/