带有绑定的NSComboBox和NSTextField

时间:2011-07-11 22:27:41

标签: xcode cocoa cocoa-bindings nstextfield nscombobox

我有一个NSArrayController,我填写了awakeFromNib方法。数据包含密钥:idnamedescription。我有一个ComboBox和一个绑定到NSArrayController的TextField,第一个绑定了名称,第二个绑定了id。如果我更改ComboBox中的选择,我希望TextField中的值更改,反之亦然。我阅读了TextField和ComboBox绑定的文档,但我不明白如何实现这一点。

1 个答案:

答案 0 :(得分:1)

这里的诀窍是你需要其他地方来放置NSComboBox的值。 NSArrayController适用于向NSComboBox提供库存值,但是您可以在NSComboBox中键入任意值,这些值可能不在NSArrayController的contentArray中,因此您需要在其他位置放置值并不奇怪。我可以通过在AppDelegate上添加一个简单的值来快速模拟这个:

@interface SOAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
// The NSArrayController you were talking about...
@property (assign) IBOutlet NSArrayController* popupValues;    
// The other place to store data...
@property (retain) id comboBoxValue;

@end

然后在实施中:

@implementation SOAppDelegate

@synthesize window = _window;
@synthesize comboBoxValue = _comboBoxValue;

- (void)dealloc
{
    [_comboBoxValue release];
    _comboBoxValue = nil;
    [super dealloc];
}

-(void)awakeFromNib
{    
    [super awakeFromNib];
    NSMutableDictionary* item1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                                  [NSNumber numberWithUnsignedInteger: 1], @"id", 
                                  @"Item 1 Name", @"name", 
                                  @"Item 1 Description", @"description", 
                                  nil];
    NSMutableDictionary* item2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                                  [NSNumber numberWithUnsignedInteger: 2], @"id", 
                                  @"Item 2 Name", @"name", 
                                  @"Item 2 Description", @"description", 
                                  nil];
    NSMutableDictionary* item3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                                  [NSNumber numberWithUnsignedInteger:3], @"id", 
                                  @"Item 3 Name", @"name", 
                                  @"Item 3 Description", @"description", 
                                  nil];

    NSMutableArray* array = [NSMutableArray arrayWithObjects: item1, item2, item3, nil];
    self.popupValues.content = array;
}

@end

然后对于绑定,我将其设置为:

NSComboBox:

  • 内容 - &gt; Array Controller.arrangedObjects
  • 内容值 - &gt; Array Controller.arrangedObjects.name
  • 价值 - &gt; App Delegate.comboBoxValue(如果您希望在输入NSComboBox时逐个字母地更新NSTextField,请选中Continuously Updates Value

的NSTextField:

  • 价值 - &gt; App Delegate.comboBoxValue(如果您希望在输入NSTextField时逐个更新NSComboBox,请选中Continuously Updates Value

如果你想要输入的新值被添加到数组中,我很遗憾地说,只有这两个控件和绑定才能实现。这有点复杂。但是这个简单案例的技巧是你需要一些地方存储值 other ,而不是你用来为NSComboBox提供预加载值的NSArrayController。