2015-07-12 74 views
1

我有一个NSPopupButton其内容被绑定到一个NSArray,假设阵列是独立NSPopUpButton内容而使用绑定

@[ 
    @"Option 1", 
    @"Option 2" 
]; 

及其选定对象绑定到用户默认值控制器,并且被写入到一个用户默认系统的首选文件。

在我的代码中,我检查首选项是否设置为@"Option 1",并相应地执行操作。

这一切都运行良好(虽然我确实感到有点不安,检查什么是UI的价值,但无论...),直到我需要本地化。

因为值是标签,所以我遇到问题。

如果我的用户在法国,他的偏好文件将会说@"L’option 1",这不等于@"Option 1"。我需要从意义上抽象出演示文稿,这非常困难。

我把绑定分成两个数组,我们称它们为valueslabels

比方说,就像这样:

values = @[ 
      @"option_1", 
      @"option_2" 
      ]; 

labels = @[ 
      NSLocalizedString(@"Option 1", nil), 
      NSLocalizedString(@"Option 2", nil) 
      ]; 

我绑定的NSPopUpButtonContent结合values及其Content Values结合labels。但是,弹出列表显示option_1option_2,它似乎不想使用labels数组标记弹出式按钮中的项目。

如何让NSPopUpButton在内部使用values并将其存储在首选项文件中,但是会向用户显示labels

如果您能想出更好的解决方案,则无需采用这种方式进行架构设计。关键是我想存储并检查一个值,并将该值与适当地本地化的标签相关联。

回答

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 

你有+initialize

NSValueTransformer *localizeTransformer = [[LocalizeTransformer alloc] init]; 
[NSValueTransformer setValueTransformer:localizeTransformer 
           forName:@"LocalizeTransformer"]; 
登记变压器 awakeFromNib或更好

然后它出现在值变换器的弹出式菜单中

+0

谢谢。这并没有完全起作用,它确实使用正确的本地化值替换了字符串,但它将转换后的本地化字符串写入了首选项文件,所以我在这方面回到了原点。我可以启用反向转换并对NSLocalizedString执行反向查找,但似乎并不完全确定。 – magiclantern

+0

在这种情况下,将用户默认值存储在代码中而不是使用绑定可能会更方便。 – vadian

0

绑定Selected Tag到您的User Defaults Controller而不是Selected Object

如果NSPopupButton选项已修复,请在Interface Builder中添加NSMenuItems并设置它们的Tags。否则将NSMenuItem的数组绑定到正确的Tags

Selected Index也可以,但只有在您更改订单之前。