[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 что-либо, что угодно с табличным представлением.
Что я делаю неправильно?
Ответы
Ответ 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