NSTableview случайно пуст при запуске - PullRequest
0 голосов
/ 11 марта 2011

Я надеюсь, что это достаточно распространенная проблема, и на довольно широкий вопрос может быть дан очевидный ответ.Почему мой NSTableView - после загрузки приложения - иногда заполняется данными из подключенного ( Core Data ) источника данных, а иногда пустым.Это кажется случайным.Ничто не меняется между выходом и запуском.

Справка:

  • Источник данных NSTableView представляет собой один NSArrayController, который имеет managedObjectContext, связанный с моделью данных ядра объекта..
  • NSTableView и NSArrayController все правильно подключены к розеткам и привязкам.Отладка успешно работала с любыми тестами, о которых я думал, и тот факт, что он работает случайным образом, предполагает, что что-то работает.
  • Я собираюсь предположить, что проблема заключается в том, что элемент моего проекта иногда загружается вовремя, а незагружен во времени.Я также предположил, что NSArrayController не получил данные вовремя, пока все остальное не закончило загрузку.Я попытался исправить это, задав NSTableView до reloadData после завершения загрузки NSArrayController:

[jobsController addObserver:self forKeyPath:@"arrangedObjects.jobTitle" options:0 context:nil];

и

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == jobsController)
    {
        NSLog(@"jobsController finished loading");
        [tableView reloadData];
    }
}

Я также тестировал, используя изолированную кнопку тестирования, которая вызывала reloadData для NSTableView всякий раз, когда я нажимал на нее.Это не имело никакого эффекта.Извиняюсь за отсутствие кода.Проект довольно большой и сложно выделить код для этой проблемы.Я надеюсь, что эта проблема достаточно распространена, и ответ может быть определен на основе аналогичного опыта.

Обновление

Я довольно уверен, что это связано с тем, что NSArrayController не готов (поскольку журнал arrangedObjects показывает пустой набор, когда таблица не заполняетсяи наоборот, когда это так).Чтобы немного расширить мои настройки, у меня есть два других NSArrayController s (итак, всего 3).Контроллер, который заполняет NSTableView, является дочерним по отношению к одному контроллеру, который является дочерним по отношению к другому.У меня есть теория, что таблица заполняется только тогда, когда порядок загрузки NSArrayControllers является (по совпадению) parent> parent> parent, поскольку каждый дочерний элемент полагается на своего родителя NSArrayController для своего набора содержимого.Возможно, мое решение состоит в том, чтобы вручную выбрать порядок загрузки контроллеров?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

В методе awakeFromNib вашего табличного представления вызовите метод fetch для контроллера массива. Это заполнит контроллер массива необходимыми данными, чтобы вы вызывали reloadData, чтобы загрузить данные.

0 голосов
/ 12 марта 2011

Я нашел ответ и думаю, что эта ситуация может повторяться для других, так что, надеюсь, это полезно для них.У меня был «набор содержимого» моего NSArrayController, установленного на его родительские NSArrayController обратные отношения.Это имело смысл ранее в проекте, когда я хотел заполнить дочерние массивы только выбранной информацией родительских массивов.

В этом случае эта функция больше не нужна, и поэтому я забыл, что она ведет себя так,В результате, когда приложение запускалось, оно (казалось) случайным образом выбирало объект в верхней части NSArrayController и заполняло его дочерний элемент NSArrayController объектами, относящимися только к его выбранному родителю.Если бы какой-либо из них был пустым, это не привело бы к тому, что никакие объекты не попадали бы к дочернему элементу NSArrayController, который заполняет NSTableView, и объясняет, почему он казался случайным образом заполненным, как он чувствовал.

...