NSPopupButton 与 Value Transformer 的绑定
Posted
技术标签:
【中文标题】NSPopupButton 与 Value Transformer 的绑定【英文标题】:NSPopupButton Bindings with Value Transformer 【发布时间】:2012-09-20 03:36:46 【问题描述】:我不知道我看到的弹出按钮是否与值转换器的绑定是应有的方式 - 我看到的不寻常的事情(至少就我所看到的而言)已经看到值转换器和表格视图)是transformedValue:方法中的“值”参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串。当我使用表格视图完成此操作时,为表格中的每个显示行调用一次转换器,并且“值”参数是绑定到该行和列的任何对象,而不是用作内容数组的整个数组用于阵列控制器。
我有一个非常简单的应用程序来测试它。在应用程序委托中有这样的:
+(void)initialize
RDTransformer *transformer = [[RDTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"testTransformer"];
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
self.theData = @[@@"name":@"William", @"age":@"24",@@"name":@"Thomas", @"age":@"23",@@"name":@"Alexander", @"age":@"64",@@"name":@"James", @"age":@"47"];
在 RDTransformer 类中是这样的:
+ (Class)transformedValueClass
return [NSString class];
+(BOOL)allowsReverseTransformation
return NO;
-(id)transformedValue:(id)value
NSLog(@"%@",value);
return value;
在 IB 中,我在窗口中添加了一个 NSPopupButton,在对象列表中添加了一个数组控制器。控制器的内容数组绑定到 App Delegate.theData,弹出按钮的 Content Values 绑定到数组 Controller.arrangedObjects.name 和值转换器 testTransformer。
当我运行程序时,从transformedValue: 方法得到的日志是这样的:
2012-09-19 20:31:39.975 PopupBindingWithTransformer[793:303] (
)
2012-09-19 20:31:40.019 PopupBindingWithTransformer[793:303] (
William,
Thomas,
Alexander,
James
)
从我在 SO 上看到的情况来看,这似乎不是其他人的经历。绑定或值转换器有什么我做错了吗?
【问题讨论】:
【参考方案1】:不幸的是,这就是 NSPopUpButton 的工作原理。问题不仅限于该控件。如果您尝试将 NSArrayController.contentArray 绑定到另一个 NSArrayControllers.arrangedObject.someProperty,您将遇到同样的问题。这是我在所有值转换器中使用的一个简单的解决方法,它使它们可以与表格和弹出窗口一起使用:
您可以通过以下方式修改您的价值转换器:
-(id)transformedArrayValue:(NSArray*)array
NSMutableArray *result = [NSMutableArray array];
for (id value in array)
[result addObject:[self transformedValue:value]];
return result;
-(id)transformedValue:(id)value
if ([value isKindOfClass:[NSArray class]])
return [self transformedArrayValue:value];
// Do your normal-case transform...
return [value lowercaseString];
它并不完美,但很容易复制。我实际上将transformedArrayValue:
放在了一个类类别中,这样我就不需要到处复制了。
【讨论】:
是的,我做了类似的事情来让我的转换器使用弹出按钮。只要您知道它返回一个数组并将其视为这样,您就可以使它们工作。我会等着看看接下来几天是否还有其他消息,但如果没有,我会接受你的回答。 哇,谢谢! 这到底是在哪里记录在案的?对于这个星球上最有价值的公司来说,工作真的非常糟糕……以上是关于NSPopupButton 与 Value Transformer 的绑定的主要内容,如果未能解决你的问题,请参考以下文章
NSPopUpButton:多个值和 selectedIndex 绑定
如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件