Objective c 带值转换器的NSPopupButton绑定
我不知道用值转换器绑定的弹出按钮所看到的是不是应该是这样的——我看到的不寻常的事情(至少就我看到的值转换器和表视图而言)是“值”transformedValue:方法中的参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串。当我使用表视图完成此操作时,将为表中显示的每一行调用一次transformer,“value”参数是绑定到该行和列的任何对象,而不是作为数组控制器的内容数组的整个数组 我有一个非常简单的应用程序来测试这个。在应用程序代理中有以下内容:Objective c 带值转换器的NSPopupButton绑定,objective-c,macos,cocoa-bindings,nspopupbutton,nsvaluetransformer,Objective C,Macos,Cocoa Bindings,Nspopupbutton,Nsvaluetransformer,我不知道用值转换器绑定的弹出按钮所看到的是不是应该是这样的——我看到的不寻常的事情(至少就我看到的值转换器和表视图而言)是“值”transformedValue:方法中的参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串。当我使用表视图完成此操作时,将为表中显示的每一行调用一次transformer,“value”参数是绑定到该行和列的任何对象,而不是作为数组控制器的内容数组的整个数组 我有一个非常简单的应用程序来测试这个。在应用程序代理中有以下内容: +(void)initialize
+(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:
放在一个类类别中,这样我就不需要到处复制它了。是的,我做了类似的事情,让我的转换器使用一个弹出按钮。只要您知道它返回一个数组并将其视为一个数组,您就可以让它们工作。我会等着看在接下来的几天里是否还有其他消息,但如果没有,我会接受你的回答。哇,谢谢你!这到底是在哪里记录的?对于这个星球上最有价值的公司来说,这真是一份糟糕的工作。。