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 的绑定的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa NSPopupButton 问题

NSPopUpButton:多个值和 selectedIndex 绑定

oc之mac中NSPopUpButton

如何以编程方式控制 NSPopUpButton 上的 TAB 按键事件

NSPopUpButton 在 Swift Playground 中灰显

根据 NSPopupButton 中的选择更新 NSTextField