Привязка с выбором NSArrayController в другой кончик
У меня есть два перья:
- Store.nib
- Product.nib
Владелец файла Product.nib является подклассом NSViewController
который имеет свойство product
с которыми связаны различные элементы управления:
@property(nonatomic, retain) SRProduct *product;
Store.nib имеет NSArrayController
объект, который был привязан к свойству SRApplicationController
, который является этим свойством:
@property(nonatomic, retain) NSArray *products;
SRApplicationController
имеет выход к этому NSArrayController
объект.
в -[SRApplicationController init]
метод я инициирую SRProductController
объект с пером Product.nib. В -[SRApplicationController awakeFromNib]
Я добавляю представление контроллера продукта к представлению в Store.nib и связываю productsArrayController
свойство (выход) SRApplicationController
возражать против product
контроллера продукта:
- (id)init {
if (self = [super init]) {
self.productController = [[SRProductController alloc] initWithNibName:@"Product" bundle:nil];
}
return self;
}
- (void)awakeFromNib {
[self.productView removeAllSubviews]; // this method is from a category
[self.productView addSubview:self.productController.view];
[self.productController.view setFrame:self.productView.bounds];
[self.productsArrayController bind:@"selectedObjects" toObject:self.productController withKeyPath:@"product" options:nil];
}
Когда я запускаю приложение, я не получаю ни ошибок, ни предупреждений, консоль остается пустой, в табличном представлении со всеми продуктами в Store.nib показаны все продукты, и я могу выбрать их. Проблема в том, что все поля в Product.nib пусты, но они связаны с product
свойство владельца файла. Кто-нибудь может мне помочь с этой проблемой? Заранее спасибо.:)
2 ответа
Где-то есть пример кода, который показывает, как это сделать, я не могу вспомнить, если это код Apple или откуда-то еще. По сути, вам нужно иметь контроллер массива в каждом файле пера. Контроллер массива в кончике стиля списка должен быть связан нормально, а его контроллер массива должен быть доступным свойством. Во втором nib-файле вам нужно связать содержимое контроллера массива как обычно. Также необходимо убедиться, что владелец файла этого пера детали имеет связь с владельцем файла пера списка. Затем вы привязываете дескриптор сортировки для контроллера массива деталей к listController.arrayController.sortDescriptors
(это может быть на самом деле sortDescriptor
не могу вспомнить с макушки головы). Вы также привязываете индекс выбора таким же образом. Это позволит контроллеру массива в наконечнике детали следить за тем, что происходит в наконечнике списка, после чего вы просто привязываете каждый элемент детали как обычно (то есть текстовое поле имени продукта будет иметь привязанное значение arrayController.selection.productName
, Если вы забудете привязать дескриптор сортировки контроллера массива пера детали к его аналогу в списке пера, перо детали будет обновляться каждый раз, когда выбор изменяется в списке, но он может не измениться на нужный продукт (привязка просто пропускает selectionIndex не какой объект выделен).
При выделении контроллера представления для Product.nib вы должны привязать его свойство "product" к выбору вашего контроллера массива, это можно сделать только в коде, но это избавит от необходимости использовать несколько экземпляров контроллера массива и избавит от необходимости связать их вместе, чтобы они выглядели одинаково.
Кроме того, я предлагаю не связывать содержимое контроллера массива с вашим собственным NSArray, если вы не связываете это свойство, которое контроллер массива будет выделять и управлять своим собственным массивом. Вы сможете добавлять / удалять объекты напрямую, вместо того, чтобы полагаться на собственное свойство, чтобы тщательно уведомить NSArrayController о том, что произошло изменение.
Привязка "содержимого" предназначена для того, чтобы позволить привязать объекты Oreject объекта контроллера массива к содержимому другого контроллера, чтобы иметь возможность фильтровать и сортировать содержимое по-разному.