NSComboBox и NSTextField с привязками - PullRequest
1 голос
/ 12 июля 2011

У меня есть NSArrayController, который я заполняю в методе awakeFromNib.Данные имеют ключи: id, name и description.У меня есть ComboBox и TextField, связанный с NSArrayController первый с именем, а второй с идентификатором.Если я изменю выбор в ComboBox, я хочу, чтобы значение в TextField изменилось, и наоборот.Я прочитал документы для привязок TextField и ComboBox, но я не понимал, как этого добиться.

1 Ответ

2 голосов
/ 06 января 2012

Хитрость здесь в том, что вам нужно где-то еще , чтобы поместить значение NSComboBox. NSArrayController отлично подходит для предоставления значений запасов в NSComboBox, но вы можете вводить произвольные значения в NSComboBox, которые могут отсутствовать в contentArray NSArrayController, поэтому неудивительно, что вам нужно куда-то еще поместить это значение. Я смог быстро смоделировать это, просто добавив простое значение в 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:

  • Содержимое -> Array Controller.arrangedObjects
  • Значения содержимого -> Array Controller.arrangedObjects.name
  • Значение -> App Delegate.comboBoxValue (отметьте Continuously Updates Value, если вы хотите, чтобы NSTextField обновлялся по буквам при вводе в NSComboBox)

NSTextField:

  • Значение -> App Delegate.comboBoxValue (отметьте Continuously Updates Value, если вы хотите, чтобы NSComboBox обновлялся по буквам при вводе в NSTextField)

Если вы хотите, чтобы новые значения, которые вы вводите, были добавлены в массив, я сожалею, что это нелегко выполнить только с этими двумя элементами управления и привязками. Это немного сложнее. Но хитрость для простого случая заключается в том, что вам нужно место для хранения значения , отличного от , чем NSArrayController, который вы используете для предоставления предварительно загруженных значений в NSComboBox.

...