NSComboBox и NSTextField с привязками

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


person Javier Beltrán    schedule 11.07.2011    source источник


Ответы (1)


Уловка здесь в том, что вам нужно где-нибудь еще, чтобы поместить значение 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:

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

NSTextField:

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

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

person ipmcc    schedule 06.01.2012
comment
на мой взгляд, это предложение не решает проблемы. Как говорится в вопросе: у меня есть ComboBox и TextField, привязанные к NSArrayController, первый с именем, а второй с идентификатором. Если я изменю выделение в ComboBox, я хочу, чтобы значение в TextField изменилось, и наоборот. Итак, проблема заключается в том, чтобы выбрать значение в nscombobox, например name, и показать относительный идентификатор в NSTextView. После вашего ответа nstextview покажет точно то же, что и в поле со списком. Два раза одни и те же данные. - person sundsx; 02.12.2014