NSArrayController слишком поздно для источника данных NSTableView? - PullRequest
1 голос
/ 01 февраля 2012

Итак, я создаю экземпляр NSWindowController, который, в свою очередь, создает экземпляр .xib.Xib имеет NSArrayControllers, которые заполняют свой массив NSManagedObjects.Контроллер окна имеет (изменяемое) свойство массива, которое служит источником данных для NSTableView в .xib.У меня реализованы методы NSTableViewDataSource (и делегат).Пока все хорошо ..

У оконного контроллера есть выходы на контроллеры массива в xib.Когда я пытаюсь заполнить массив (словари, ключи объектов соответствуют идентификаторам столбцов таблицы, проблем нет), мне очень трудно получить содержимое контроллеров массива.

Почему-то я не получаю контроллеры массива, чтобы вовремя получать их управляемые объекты.Когда я получаю массив (managedObjects :) контроллеров массива для создания словарей, для свойства массива, заполняющего таблицу, я ничего не получаю.

Я делаю вещи не в правильном порядке?Может кто-нибудь указать мне хорошее объяснение, как и когда IB-объекты (такие как контроллеры массива) выбирают свои данные?Должен ли я переместить заполняющий код таблицы в (подкласс) объект в конструкторе интерфейса?Я пытался манипулировать массивом таблицы в методах init, awakeFromNib и windowDidLoad контроллера окна.Хотя это, кажется, работает, я сомневаюсь, что мне нужно было бы добавить объект массива таблицы в методе makeKeyAndOrderFront окна.

1 Ответ

1 голос
/ 13 февраля 2012

правый.

Кажется, что методы init и windowDidLoad windowController - это неправильные места для заполнения массива таблицы. Хотя я не совсем уверен, почему.

Однако все, кажется, работает нормально, когда я жду, пока завершится awakeFromNib оконного контроллера, вот так:

- (void)awakeFromNib {
    [super awakeFromNib];
    [self populateTable];
}

Затем метод populateTable использует переменные экземпляра IBOutlet, которые подключаются в .xib от владельца файла (мой оконный контроллер) к NSArrayControllers, которые содержат NSManagedObjects.

Может ли быть так, что метод awakeFromNib элементов, которые упорядочены иерархически глубже в xib, запускается быстрее, чем awakeFromNib, из элементов, расположенных выше в структуре xib?


У меня также были некоторые проблемы с обнаружением, что выбор контроллера массива возвращает NSObjectControllerProxy вместо фактического выбранного управляемого объекта.

MyManagedObject *object = [myArrayController selection];

Выше код не работает. Следующая строка кода делает свое дело, хотя мне это кажется немного сложным ..

MyManagedObject *object = [[myArrayController arrangedObjects] objectAtIndex:[myArrayController selectionIndex]];
...