3

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

@interface CountryInfo : NSObject

@property (nonatomic, retain) NSString *countryName;

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

所以,我像这样设置我的 .xib:

CountryArrayController (NSArrayController)

内容数组

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

NSC组合框

内容

  • 绑定到:CountryArrayController > Controller Key:arrangeObjects

内容价值

  • 绑定到:CountryArrayController > Controller Key:arrangeObjects > Model Key Path:countryName

到现在为止还挺好。现在,如何绑定NSComboBox? 该文档指出:

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

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

4

2 回答 2

10

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

NSComboBox有不同的行为,因为它需要支持用户直接输入文本的场景。NSPopUpButton旨在仅使用一组预定义的值,并且相对于它的“选择”绑定而言,其行为与预期一致。

于 2013-05-16T20:37:38.123 回答
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

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

于 2020-12-29T11:05:02.757 回答