Подтвердить что ты не робот

[tableView reloadData]; не работает, пока я не прокручу tableView

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

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

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

Я получаю вывод журнала "Received 4 results", но представление таблицы не перезагружает данные до тех пор, пока я не прокручу/перетащил пару пикселей. Я использую встроенный стиль ячейки UITableViewCellStyleSubtitle и im, не изменяя высоту или ding что-либо, что угодно с табличным представлением.

Что я делаю неправильно?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вызов

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

вместо

[self.tableview reloadData]

Ответ 3

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

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

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

Ответ 4

У меня такая же проблема, и я пробовал все решение, которое я могу найти в 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];
}

И тогда все работает нормально.

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

Ответ 5

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