使用绑定

时间:2015-07-12 16:39:47

标签: macos cocoa cocoa-bindings nspopupbutton

我有一个NSPopupButton,其内容绑定到NSArray,假设数组是

@[
    @"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)
          ];

我已将NSPopUpButton的{​​{1}}绑定绑定到Content,并将values绑定绑定到Content Values。但是,弹出列表显示labelsoption_1,它似乎不想使用option_2数组来标记弹出按钮中的项目。

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

如果您能想到更好的解决方案,则无需以这种方式构建。关键是我要存储并检查一个值,并将该值与正确定位的标签相关联。

2 个答案:

答案 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也可以,但只有在您更改订单之后才会有效。