Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 带值转换器的NSPopupButton绑定_Objective C_Macos_Cocoa Bindings_Nspopupbutton_Nsvaluetransformer - Fatal编程技术网

Objective c 带值转换器的NSPopupButton绑定

Objective c 带值转换器的NSPopupButton绑定,objective-c,macos,cocoa-bindings,nspopupbutton,nsvaluetransformer,Objective C,Macos,Cocoa Bindings,Nspopupbutton,Nsvaluetransformer,我不知道用值转换器绑定的弹出按钮所看到的是不是应该是这样的——我看到的不寻常的事情(至少就我看到的值转换器和表视图而言)是“值”transformedValue:方法中的参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串。当我使用表视图完成此操作时,将为表中显示的每一行调用一次transformer,“value”参数是绑定到该行和列的任何对象,而不是作为数组控制器的内容数组的整个数组 我有一个非常简单的应用程序来测试这个。在应用程序代理中有以下内容: +(void)initialize

我不知道用值转换器绑定的弹出按钮所看到的是不是应该是这样的——我看到的不寻常的事情(至少就我看到的值转换器和表视图而言)是“值”transformedValue:方法中的参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串。当我使用表视图完成此操作时,将为表中显示的每一行调用一次transformer,“value”参数是绑定到该行和列的任何对象,而不是作为数组控制器的内容数组的整个数组

我有一个非常简单的应用程序来测试这个。在应用程序代理中有以下内容:

+(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中,我在窗口中添加了一个NSPOUPPBUTON,在对象列表中添加了一个数组控制器。控制器的内容数组绑定到App Delegate.theData,弹出按钮的内容值绑定到数组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
)

从我所看到的情况来看,这似乎不是其他人的经历。绑定或值转换器有什么问题吗?

不幸的是,NSpoupButton就是这样工作的。问题不限于这种控制。如果尝试将一个NSArrayController.contentArray绑定到另一个NSArrayController.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:
放在一个类类别中,这样我就不需要到处复制它了。

是的,我做了类似的事情,让我的转换器使用一个弹出按钮。只要您知道它返回一个数组并将其视为一个数组,您就可以让它们工作。我会等着看在接下来的几天里是否还有其他消息,但如果没有,我会接受你的回答。哇,谢谢你!这到底是在哪里记录的?对于这个星球上最有价值的公司来说,这真是一份糟糕的工作。。