/ / Използване на един NSArrayController от множество XIB - обектив-c, какао, интерфейс-строител, какао-свързвания, nsarraycontroller

Използване на един NSArrayController от множество XIB - цел-c, какао, интерфейс-строител, какао-свързвания, nsarraycontroller

Имам някои проблеми, които показват съдържанието на един NSArrayController в два прозореца, определени в различни XIB.

В основния ми прозорец (в MainMenu.xib) имам NSTableView, който е свързан с NSArrayController

В моя втори XIB имам друг прозорец, който съдържа NSTableView. Създадох нов NSArrayController и свързах таблицата със съдържанието на този NSArrayController.

И двата NSArrayControllers са обвързани с точно същия NSArray.

В началото всичко е наред, но проблемът ече ако даден обект е добавен към масива с помощта на NSArrayController в главния прозорец, изгледът на вторичния прозорец на данните не се обновява. Това е най-вероятно, защото не знае, че трябва да се обновява, тъй като NSArrayController не е бил използван за добавяне на новия обект.

Това, което бих искал да направя, е да използвам точно същия екземпляр на NSArrayController в двата прозореца. По този начин, ако даден обект е добавен към масива, и двата изгледа ще бъдат уведомени за промяната.

Проблемът е, че не мога да разбера как да го направятова в Interface Builder. Не мога да свържа NSArrayController с друг NSArrayController (получавам грешка по време на изпълнение, показвайки, че тя може да бъде обвързана само с NSArray). Свързването на NSArrayController към NSArrayController член на собственика на файла няма да помогне, тъй като това унищожи NSArrayController, който искам да използвам.

Предполагам, че бих могъл да поставя линковетекод, но изглежда, че би било по-добре да се използва Interface Builder, ако е възможно. Има ли начин да направите това в Interface Builder, или може би по-добър начин да настроите всичко това заедно?

Update: В отговор на отговора и коментарите на Чък, азОпитах следното: -Свържете съдържанието на таблицата на моя NSTableView към подредените обекти на члена на NSArrayController (ако използвах самия NSArrayController, се появи грешка в дневника: "[NSArrayController count]: неразпознат селектор, изпратен до инстанция") - Свържете всяка колона в таблицата със Собственика на Файла, с Моделен Ключов Път от arrayController.arrangedObjects.propertyName

Това все още не е довело до съдържанието наполучавате актуализации на таблицата. Мисля, че това е така, защото аз се обвързвам с аранжираните обекти на NSArrayController, отколкото към самия NSArrayController. Но, ако се свържа директно с NSArrayController, това ми дава грешки.

Обикновено бих избрал моя NSArrayControllerот "Привързване към" ComboBox, използвайте аранжирани обекти като Ключ на контролера, а самия имот като Моделен ключов път. Не съм сигурен как да направя еквивалента на този в този случай - ако мога изобщо.

Направих ли нещо погрешно в процеса по-горе?

Отговори:

1 за отговор № 1

Най-добрият вариант, който успях да измисля, е да уведомя втория NSArrayController че управлението на масива се е променило чрез обаждане rearrangeObjects: върху него. Това изглежда тромаво, но работи.


1 за отговор № 2

Какво ще кажете за тях като прокси обекти в IB, а след това реализирайки действителния код, може би в приложението ви?


1 за отговор № 3

Можете да получите и двете NSArrayControllers да се актуализират чрез KVO, когато масивът е добавен към. Номерът е в това, че трябва да наблюдавате и да добавяте масива в съвместим с KVO начин.

Вие ще искате някой обект, който притежава масива, нека да енаречете го "модел". Масивът трябва да бъде ключ на обекта, нека да извикаме ключа "contentArray". , Тогава добавянето / премахването от масива трябва да работи, например:

Controller1 е обвързан с self.model.contentArray

Controller2 е обвързан с self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
[contentArr addObject:content]; //this will trigger KVO notifications
}

Като алтернатива можете да направите уведомленията на KVO ръчно по следния начин:

-(void)addContent(id content)
{
[self willChangeValueForKey:@"contentArray"];
[m_contentArray addObject:content];
[self didChangeValueForKey:@"contentArray"];
}

0 за отговор № 4

Няма причина да имаме два контролера на масиватрябва да направи един изглед не актуализиран, когато актуализирате чрез друг. Ако не се случва, звучи като вашите KVO известия се губят някъде. add: метод, може би?), без да изпращате съответните уведомления за промяна.