我有一个NSPopupButton,其内容绑定到NSArray,假设数组是
@[
@"Option 1",
@"Option 2"
];
其选定对象绑定到用户默认值控制器,并由用户默认系统写入首选项文件。
在我的代码中,我检查首选项是否设置为@"Option 1"
,并相应地执行操作。
这一切都运行良好(虽然我确实感到有点不安地检查什么是基本上是UI值,但无论如何......)直到我需要本地化。
因为价值是标签,我遇到了问题。
如果我的用户在法国,他的偏好文件会说@"L’option 1"
,这不等于@"Option 1"
。我需要从意义中抽象出来,这证明非常困难。
我将绑定分成两个数组,让我们称它们为values
和labels
。
让我们说它们看起来像这样:
values = @[
@"option_1",
@"option_2"
];
labels = @[
NSLocalizedString(@"Option 1", nil),
NSLocalizedString(@"Option 2", nil)
];
我已将NSPopUpButton
的{{1}}绑定绑定到Content
,并将values
绑定绑定到Content Values
。但是,弹出列表显示labels
和option_1
,它似乎不想使用option_2
数组来标记弹出按钮中的项目。
如何让labels
在内部使用NSPopUpButton
并将其存储在首选项文件中,但是向用户显示values
?
如果您能想到更好的解决方案,则无需以这种方式构建。关键是我要存储并检查一个值,并将该值与正确定位的标签相关联。
答案 0 :(得分:0)
Cocoa绑定与值变换器非常兼容,因为您可以直接在绑定窗口中应用它们,例如
@implementation LocalizeTransformer
+ (Class)transformedValueClass
{
return [NSArray class];
}
+ (BOOL)allowsReverseTransformation
{
return NO;
}
- (id)transformedValue:(id)value {
if (![value isKindOfClass:[NSArray class]]) return nil;
NSMutableArray *output = [NSMutableArray arrayWithCapacity:[value count]];
for (NSString *string in value) {
[output addObject:NSLocalizedString(string, nil)];
}
return [output copy];
}
@end
您必须在awakeFromNib
+initialize
或更好地注册变压器
NSValueTransformer *localizeTransformer = [[LocalizeTransformer alloc] init];
[NSValueTransformer setValueTransformer:localizeTransformer
forName:@"LocalizeTransformer"];
然后它出现在值变换器的弹出菜单中
答案 1 :(得分:0)
将Selected Tag
绑定到User Defaults Controller
而不是Selected Object
。
如果修复了NSPopupButton选项,请在NSMenuItems
中添加Interface Builder
并设置其Tags
。否则,再使用适当的NSMenuItem
绑定一个Tags
数组。
Selected Index
也可以,但只有在您更改订单之后才会有效。