将Cocoa NSComboBox值绑定到对象

时间:2013-05-16 16:38:01

标签: cocoa binding cocoa-bindings nsarraycontroller nscombobox

假设我有一个NSObject子类代表一个国家,例如

@interface CountryInfo : NSObject

@property (nonatomic, retain) NSString *countryName;

我的模型包含NSMutableArrayCountryInfo个。我想将数组绑定到NSComboBox。组合框应显示国家/地区名称,并允许用户选择国家/地区。

所以,我设置了我的.xib:

CountryArrayController(NSArrayController)

ContentArray

  • 绑定到:文件所有者>模型关键路径: self.model.countries

NSComboBox

内容

  • 绑定到: CountryArrayController >控制器密钥: arrangeObjects

内容值

  • 绑定到: CountryArrayController >控制器密钥: arrangeObjects >模型关键路径: countryName

到目前为止,这么好。现在,如何绑定NSComboBox?文档说明:

"An NSString or NSNumber that specifies the value of the NSComboBox."

这是什么意思? 我注意到我可以将其绑定到我的模型上的NSString,它将反映所选的countryName。但我想绑定到CountyInfo对象本身!无论是直接还是通过绑定到我的阵列控制器上的选择:我该如何设置它?

2 个答案:

答案 0 :(得分:10)

我接近这个错误 - 使用的正确控制是NSPopUpButton而不是NSComboBox

NSComboBox具有不同的行为,因为它需要支持用户直接输入文本的场景。 NSPopUpButton旨在仅使用一组预定义的值,并按照预期的“选择”绑定行为。

答案 1 :(得分:1)

这个问题似乎没有一个简单的解决方案,这是我找到的一个,实现了一个 NSArrayController 类别:

@interface NSArrayController( ComboBoxCompatibility )
@property(readwrite )NSString *firstSelectedObject;
@end

对于 getter 和 setter :

@implementation NSArrayController (ComboBoxCompatibility)
-(NSString *)firstSelectedObject
{
    return [[self selectedObjects] firstObject];
}
-(void)setFirstSelectedObject:(NSString *)firstSelectedObject
{
    NSUInteger idx = [[self arrangedObjects] indexOfObject:firstSelectedObject];
    [self setSelectionIndex:idx];
}
@end

然后,您可以将 NSComboBox 的值绑定到数组控制器的 firstSelectedObject,只要其中的对象实现 copyWithZone:如果对象不是字符串而是具有单个属性“名称”,您也可以修改上面的代码例如,您在组合框列表中显示,在 setter 中用 [[selflocatedObjects] valueForKey:@"name"] 和 [[[selflocatedObject] firstObject] valueForKey:@"name"] 在吸气剂