【问题标题】:Is it possible to use cocoa bindings with NSTableView and Many-to-Many relationships是否可以将可可绑定与 NSTableView 和多对多关系一起使用
【发布时间】:2016-12-18 20:30:37
【问题描述】:

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

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

目前我的架构是这样的:

人物 > 标签

一行应该是这样的:

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

这可能吗?

【问题讨论】:

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


    【解决方案1】:

    有几种方法可以做到这一点。出于讨论的目的,我将假设集合属性 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
    

    【讨论】:

    • 注意:标签名称改变时标签列表不会自动刷新。
    • @Willeke,在什么意义上?每次请求时都会重新创建标签列表。 +keyPathsForValuesAffectingTagList 方法确保 KVO 知道每当 tags 以符合 KVO 的方式发生更改时,需要为 tagList 发出更改通知。使用值转换器,绑定直接观察tags,当它发生变化时,绑定视图将自行更新并使用转换器获取标签列表,该列表将是最新的。
    • 抱歉,我想得太远了。如果标签是字符串数组,它将起作用。我认为我做了太多核心数据。
    • @Willeke 可能会想到“标签”是实体而字符串是该实体的属性的情况。如果您需要在tagList 中显示多个tag.nameString,那么您将进入workarounds like this,我只是说,让KVO 见鬼去吧,并让tag 对象在父对象上调用setTagList 以强制重新计算tagListnameString 属性发生变化时。
    • 非常感谢。我最终创建了 NSValueTransformer 类。它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 2020-08-28
    • 2021-03-01
    • 2019-11-07
    • 1970-01-01
    • 2014-06-27
    • 2011-01-28
    • 2018-11-24
    相关资源
    最近更新 更多