[tableView reloadData];не работает, пока я не прокручиваю tableView - PullRequest
21 голосов
/ 11 февраля 2011

У меня есть простое приложение, которое загружает результаты поиска в формате XML, когда пользователь вводит UISearchBar. Загрузка + синтаксический анализ является многопоточным, и после этого он запускает NSNotification, чтобы сообщить ViewController с табличным представлением [tableView reloadData];

Вот код, который получает уведомление при получении результатов:

- (void)receivedResults:(id)notification {
    results = [notification object];
    DLog(@"Received %i results",[results count]);
    [[self tableView] reloadData];
}

Я получаю вывод журнала «Получено 4 результата», но табличное представление не перезагружает данные, пока я не прокручиву / перетащу его на пару пикселей. Я использую встроенный стиль ячейки UITableViewCellStyleSubtitle, и я не изменяю высоту и не добавляю ничего особенного в представление таблицы.

Что я делаю не так?

Ответы [ 5 ]

66 голосов
/ 16 августа 2012

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

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});

Я думаю, что это более практично, чем опция executeSelectorOnMainThread

34 голосов
/ 24 марта 2011

Звоните

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

вместо

[self.tableview reloadData]
4 голосов
/ 30 августа 2014

Моя проблема заключалась в том, что я отправлял NSNotification из фоновой ветки. Чтобы избежать этого, просто оберните ваш postNotificationMethod в метод dispatch_async следующим образом:

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result];
});

Когда это уведомление будет получено, tableView.reloadData будет вызвано в главном потоке.

0 голосов
/ 19 апреля 2017

перезагрузить ваш tableView в viewWillLayoutSubviews

0 голосов
/ 13 декабря 2014

У меня та же проблема, и я попробовал все решения, которые я могу найти в Google.Но все они не работают.

Наконец-то я обнаружил, что добавляю наблюдателя перед viewDidLoad, а затем [self.tableView reloadData] не работает.

Сначала я вызываю setObserverForUserInfoDatabase вviewDidLoad моего корневого контроллера представления навигации.Потому что я думаю, что это было вызвано ранее.Функция выглядит следующим образом:

- (void)setObserverForUserInfoDatabase:(NSString *)name {
    [[NSNotificationCenter defaultCenter] addObserverForName:name
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {
                                                      [self loadUserInfo];
                                                      [self.tableView reloadData];
                                                      NSLog(@"User Panel Notification \n %@", self);
                                                  }];}

Затем я перемещаю код в viewDidLoad самого viewController.

- (void)viewDidLoad {
    NSLog(@"View Did Load");
    [super viewDidLoad];

    [self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification];
}

И тогда все отлично работает.

Я надеваюпока не знаю причину.Если кто-нибудь знает, пожалуйста, скажите мне.

...