【问题标题】:NSPopupButton Bindings with Value TransformerNSPopupButton 与 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 上看到的情况来看,这似乎不是其他人的经历。绑定或值转换器有什么我做错了吗?

【问题讨论】:

    标签: objective-c macos cocoa-bindings nspopupbutton nsvaluetransformer


    【解决方案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: 放在了一个类类别中,这样我就不需要到处复制了。

    【讨论】:

    • 是的,我做了类似的事情来让我的转换器使用弹出按钮。只要您知道它返回一个数组并将其视为这样,您就可以使它们工作。我会等着看看接下来几天是否还有其他消息,但如果没有,我会接受你的回答。
    • 哇,谢谢! 这到底是在哪里记录在案的?对于这个星球上最有价值的公司来说,工作真的非常糟糕……
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多