绑定和有条件地设置隐藏

时间:2014-10-17 07:05:08

标签: objective-c macos cocoa binding

我有一个NSArrayController绑定到NSMutableArrayNSMutableDictionary

类似的东西:

[
    { "label" : "label1", "type" : "string" },
    { "label" : "label2", "type" : "boolean" }
]

现在,这个数组控制器又绑定到NSCollectionView,其中每一行(NSCollectionViewItem)代表初始数组中的一行。

我显然可以获得如下值:representedObject.labelrepresentedObject.type等等。

现在,这是一个棘手的部分:

如果我想创建一个hidden属性的绑定 - 让我们说 - NSTextField,基于类型(类似于"如果type == string) setHidden:YES else setHidden:NO",用简单的英语),如何使用绑定?我应该试试Value Transformers吗?


P.S。

  • 带有绑定的方案和到目前为止所做的一切都很有效,我不想 - 突然之间 - 开始制造一团糟。 所以,任何建议都非常受欢迎!

  • 这个问题也被标记为(虽然我对OSX感兴趣),因为不应该有任何重大差异+仅限OSX的问题可悲的是,更有可能被忽视。

1 个答案:

答案 0 :(得分:2)

我发现对模型对象使用NSMutableDictionary可以快速进行原型设计,但是在真正的应用程序中,你很快就能找到一个你最好创建一个合适的模型类的地方。现代Objective-C使这很容易:

@interface Thing : NSObject

@property (copy) NSString* label;
@property (copy) NSString* type;

@end

@implementation Thing
@end

就是这样。现在,您需要“stringTyped”属性,或类似的东西。你添加:

@property (readonly) BOOL stringTyped;

到界面和:

+ (NSSet*) keyPathsForValuesAffectingStringTyped
{
    return [NSSet setWithObject:@"type"];
}
- (BOOL) stringTyped
{
    return [self.type isEqualToString:@"string"];
}

执行。 (您实际上不需要将属性添加到接口以进行绑定以查找它。)

+keyPathsForValuesAffectingStringTyped方法允许KVO知道当type属性发生更改时,它还应向stringTyped属性的观察者发出更改通知(如果有)。请参阅+[NSObject(NSKeyValueObserving) keyPathsForValuesAffectingValueForKey:]了解其原因。

如果stringTyped属性在您的模型中没有意义,您实际上可以通过控制器层中定义的类别添加该属性。基本上,您的控制器知道模型,并且它知道视图需要一种从type属性转换为隐藏属性的方法。因此,它可以添加该转换层。在这种情况下,您可以将属性重命名为hidden,因为它可以反映视图将如何使用它。

你绝对可以通过价值转换器来实现这一目标。但是,理想情况下,您希望价值变换器是通用的,而不是专门针对单个视图的需求。但这不是一个严厉的规则。

  

P.S。

     
      
  • 问题也被标记为(虽然我对OSX感兴趣),因为不应该有任何重大差异+   遗憾的是,仅OSX问题可能会被忽略。
  •   

不要那样做。 iOS上没有绑定,因此存在“巨大差异”。