2

У меня возникла проблема, связанная с подключением нескольких NSArrayControllers к двум контроллерам представлений. Я хочу синхронизировать выделение в представлении таблицы списка источников, чтобы обновить значения во втором контроллере подробного представления.Выбор привязки для нескольких контроллеров представления в одном оконном интерфейсе

Я использую Cocoa Dev Central Build A Core Data Tutorial в качестве отправной точки, но сломал архитектуру так, что есть NSWindowController, который содержит два NSViewControllers: один для столбцов таблицы слева и один для деталей сообщения справа.

подкласс NSWindowController имеет NSArrayController, который связан с почтовым объектом и только для чтения managedObjectContext аксессору, что указывает на [[NSApp delegate] managedObjectContext]

Я тогда инициализацией два контроллера просмотра в методе windowDidLoad.

- (void)windowDidLoad 
{ 
    static NSInteger kSourceListViewIndex = 0; 
    static NSInteger kDetailViewIndex = 1; 

    self.postsListsViewController = [[MDVCPostsListViewController alloc] initWithWindowController:self]; 
    NSView *sourceListSplitViewContentView = [[self.splitView subviews] objectAtIndex:kSourceListViewIndex]; 
    NSView *sourceListView = [self.postsListsViewController view]; 
    [sourceListView setFrame:[sourceListSplitViewContentView bounds]]; 
    [sourceListView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
    [sourceListSplitViewContentView addSubview:sourceListView]; 

    // And now let's load the detail view. 
    self.postDetailViewController = [[MDVCPostDetailViewController alloc] initWithWindowController:self]; 
    NSView *detailSplitViewContentView = [[self.splitView subviews] objectAtIndex:kDetailViewIndex]; 
    NSView *detailView = [self.postDetailViewController view]; 
    [detailView setFrame:[detailSplitViewContentView bounds]]; 
    [detailView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
    [detailSplitViewContentView addSubview:detailView]; 
} 

MDVCPostsListViewController имеет NSArrayController связанное с почтовым объектом и его управляемым контекстом объекта, связанным с управляемым контекстом объекта контроллера оконного родителя (все через Interface Builder)

MDVCPostDetailViewController имеет NSObjectController обязан удался контроллер функции окна объектного контекста и объекта содержимого, привязанного к оконному контроллеру через postsListsViewController.postsArrayController.selection. Это похоже на действительно сумасшедший взлом.

Как это сделать, чтобы изменить выбор в таблице таблиц MDVCPostsListViewController, обновит выбранные значения в MDVCPostDetailViewController? Я чувствую, что я близок, но я не уверен, чего не хватает или какой лучший путь. Я чувствую, что привязка postsListsViewController.postsArrayController.selection чрезвычайно хаки. Надеюсь, что есть лучший способ.

Я загрузил свой образец проекта, который демонстрирует это для тех, кто предпочитает смотреть на код, а не просто читать описания. Вы можете взять его с моего сайта по адресу http://www.secondgearsoftware.com/attachments/stackoverflow_objectcontroller.zip

ответ

3

Как вы ожидаете, что каждый оконный контроллер обнаружит контроллер главного окна?

С кратким взглядом на проект, кажется, вы просто добавили экземпляр MDVCMainWindowController для каждого NIB. Это будут отдельные экземпляры из тех, которые фактически запускают главное окно.

Вам необходимо привязать таблицу исходных кодов выбораIndexes к контроллеру массива Post. В противном случае выбор не будет известен на уровне контроллера.

Я бы предложил переместить контроллер массива в контроллер главного окна. В вашем методе windowDidLoad вы можете передать его как в список, так и в подробное представление. Список будет привязан к builtObjects и selectionIndexes, представление детали будет привязываться к select.someKey.

+0

Это получилось. Благодаря! –

1

Проблема связана с привязкой объекта объекта NSObjectController к детальному представлению xib. Контроллер массива в представлении списка xib корректно публикует уведомления KVO (проверял это, делая экземпляр MDVCPostDetailViewController наблюдаемым с KVO), поэтому я не уверен, почему, но почему-то контроллер объекта не отвечает на них.

Однако есть несколько различных подходов, которые вы можете предпринять, которые будут работать. Вы можете избавиться от контроллера объекта и связать текстовые поля и т. Д. В подробном представлении xib непосредственно с контроллером массива (File's Owner.windowController.postsListsViewController.postsArrayController.selection.whatever).В качестве альтернативы вы можете сохранить контроллер объекта и контролировать контроллер выделения с помощью свойства выбора контроллера массива и «вручную» установить свойство объекта содержимого объекта объекта при изменении выбора.

Смежные вопросы