【问题标题】:Binding Cocoa NSComboBox value to object将 Cocoa NSComboBox 值绑定到对象
【发布时间】:2013-05-11 16:09:05
【问题描述】:

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

@interface CountryInfo : NSObject

@property (nonatomic, retain) NSString *countryName;

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

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

CountryArrayController (NSArrayController)

内容数组

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

NSComboBox

内容

  • 绑定到:CountryArrayController > 控制器键:arrangedObjects

内容价值

  • 绑定到:CountryArrayController > 控制器键:arrangedObjects > 模型键路径:countryName

到目前为止,一切都很好。现在,如何绑定NSComboBoxValue?文档指出:

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

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

【问题讨论】:

  • 你试过使用 NSValueTransformer 吗?
  • 嗨@macandyp,是的,NSValueTransformer 确实可以工作,我可以通过绑定字符串值并在代码中手动转换来获得相同的行为。似乎很奇怪,我必须编写额外的代码来实现这一点,并且不能只绑定到对象(这是我习惯的)。谢谢!
  • 我同意这有点奇怪。我知道,如果您绑定到内容,而不是绑定内容值,它将调用您的类的描述来填充组合框的字符串。不过,我不知道这是否对您有帮助。

标签: cocoa binding cocoa-bindings nsarraycontroller nscombobox


【解决方案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:如果对象不是字符串但只有一个属性“name”,您也可以修改上面的代码例如,通过在 setter 中将 [self mappedObjects] 替换为 [[self mappedObjects] valueForKey:@"name"] 和在吸气剂

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多