4

我不知道我看到的由带有值转换器的绑定填充的弹出按钮是否是它应该是的方式 - 我看到的不寻常的事情(至少就我所看到的而言)值转换器和表格视图)是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,弹出按钮的内容值绑定到数组 Controller.arrangedObjects.name 和值转换器 testTransformer。

当我运行程序时,transformValue: 方法的日志是这样的:

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 上看到的情况来看,这似乎不是其他人的经历。绑定或值转换器有什么我做错了吗?

4

1 回答 1

7

不幸的是,这就是 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:放在一个类类别中,这样我就不需要到处复制它了。

于 2012-09-24T19:47:53.197 回答