У меня есть NSArrayController, который я заполняю методом awakeFromNib
. У данных есть ключи: id
, name
и description
. У меня есть ComboBox и TextField, привязанные к NSArrayController, первый с именем, а второй с идентификатором. Если я изменю выделение в ComboBox, я хочу, чтобы значение в TextField изменилось, и наоборот. Я читал документацию по привязкам TextField и ComboBox, но не понимал, как этого добиться.
NSComboBox и NSTextField с привязками
Ответы (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.