objective-c - 是否可以将 cocoa 绑定(bind)与 NSTableView 和多对多关系一起使用

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

我想知道是否可以使用 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/

相关文章:

objective-c - NSTask + ps + App Sandbox = 错误

ios - 子类化 XCTestCase 子类 : Test Navigator does not show all tests

cocoa - nssplitview 以编程方式在顶部添加 nsview

ios - 在 ContainerController 中访问 UIViewController

objective-c - 如何使用单个 NSValueTransformer 子类切换多个菜单项的标题

ios - 选择 UITableViewCell 时 UIView backgroundColor 消失

ios - ScrollView 动画不流畅(objective-C)

objective-c - iPhone SDK合成BOOL数组

macos - 如何将位图纹理的每个像素渲染到 macOS 上屏幕的每个 native 物理像素?

objective-c - 使用时字距调整错误 -[NSString drawInRect : withAttributes:]