NSTableView -setDataSource не работает при запуске FSEvents - PullRequest
0 голосов
/ 30 ноября 2008

Итак, вот что у меня есть:

  • NSTableView с источником данных NSMutableArray
  • FSEvents отслеживает папку, содержащую файл, содержащий данные для табличного представления (Использование SCEvents для проверки качества Objective-C)
  • FSEvents запускает ту же функцию, что и кнопка перезагрузки в пользовательском интерфейсе. Эта функция обновляет табличное представление с новым источником данных на основе содержимого указанного файла через setDataSource:.

И вот что происходит:

  • Если я внесу изменение в файл, сработает FSEvent и будет вызван метод обновления.
  • Массив, который должно принимать табличное представление, действительно включает изменения, которые вызвали FSEvent.
  • setDataSource: отправляется в NSTableView с правильным источником данных.
  • Изменения не отображаются в табличном представлении!

Но тогда:

  • Если я нажму кнопку обновления, которая запускает тот же метод, что и FSEvent, представление таблицы обновляется с новыми данными.

Я также пытался заменить FSEvent NSNotification (NSApplicationDidBecomeActiveNotification), но происходит то же самое.

Кто-нибудь знает, почему это происходит?

Редактировать: Для пояснения, суть моего вопроса заключается в следующем: почему мой NSTableView перезагружается так, как должен при запуске нажатием кнопки, а не при запуске с помощью FSEvent или NSNotification?

Редактировать: Благодаря diciu я выяснил, что на самом деле все мои ссылки на пользовательский интерфейс указывают на 0x0 при срабатывании по событию, но затем имеют действительные адреса при срабатывании нажатием кнопки. Все эти объекты объявлены в IB, поэтому в моем коде не происходит их создание или распределение. Итак, мой вопрос сейчас: что я могу сделать, чтобы эти указатели не указывали на ноль?

Ответы [ 5 ]

2 голосов
/ 30 ноября 2008

Мы вызываем reloadData в NSTableView, когда у нас появляются новые данные для добавления / удаления в таблицу.

Это может помочь, чтобы заставить NSTableView перерисовать.

Я не совсем уверен, что это то, о чем ты спрашиваешь. Формулировка вашего вопроса немного запутана, вы заявляете о серии событий, но никогда не говорите правдиво.

1 голос
/ 01 декабря 2008

звучит так, как когда вы регистрируетесь на событие / уведомление, вы передаете другой экземпляр вашего класса контроллера.

1 голос
/ 30 ноября 2008

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

т.е. Вы уверены, что не вызываете [nil reloadData], который не выдает никаких ошибок? Ваша ссылка на табличное представление может быть нулевой в коде обновления, если вы установили его перед awakeFromNib или в некоторых других обстоятельствах.

1 голос
/ 30 ноября 2008

Вы устанавливаете NSArray непосредственно как источник данных табличного представления?

Это не так, как NSTableView работает. Источник данных должен быть объектом, который соответствует NSTableDataSource. NSArray нет. Вы сами пишете источник данных; Вероятно, это будет тот же объект, который у вас сейчас вызывается setDataSource:.

Другой способ - использовать привязки.

1 голос
/ 30 ноября 2008

Вы пытались вызвать свой метод из FSEvent на втором проходе цикла выполнения?

[myObject performSelector:@selector(reloadAction:) withObject:nil afterDelay:0.0];
...