我有一个NSArrayController
绑定到NSMutableArray
个NSMutableDictionary
。
类似的东西:
[
{ "label" : "label1", "type" : "string" },
{ "label" : "label2", "type" : "boolean" }
]
现在,这个数组控制器又绑定到NSCollectionView
,其中每一行(NSCollectionViewItem
)代表初始数组中的一行。
我显然可以获得如下值:representedObject.label
,representedObject.type
等等。
现在,这是一个棘手的部分:
如果我想创建一个hidden
属性的绑定 - 让我们说 - NSTextField
,基于类型(类似于"如果type == string) setHidden:YES else setHidden:NO",用简单的英语),如何使用绑定?我应该试试Value Transformers吗?
P.S。
带有绑定的方案和到目前为止所做的一切都很有效,我不想 - 突然之间 - 开始制造一团糟。 所以,任何建议都非常受欢迎!
这个问题也被标记为ios(虽然我对OSX感兴趣),因为不应该有任何重大差异+仅限OSX的问题可悲的是,更有可能被忽视。
答案 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。
- 问题也被标记为ios(虽然我对OSX感兴趣),因为不应该有任何重大差异+ 遗憾的是,仅OSX问题可能会被忽略。
不要那样做。 iOS上没有绑定,因此存在“巨大差异”。