У меня была похожая проблема, и это сводило меня с ума. В основном в моем коде есть множество конкурирующих потоков, пытающихся обновить одни и те же данные в одно и то же время (данные за табличным представлением), и я думаю, что это как-то заставляет UITableView «взорваться», и его методы делегата перестают работать. (Вы можете доказать это, добавив NSLog в методы делегата).
Это происходит совершенно случайно и очень трудно воспроизвести.
Я пытался исправить это всеми возможными способами, но единственное, что, по-видимому, надежно гарантирует, что этого не произойдет, - это полное воссоздание моего UITableView при каждом изменении данных, как показано ниже. (Так что в основном меняйте везде, где вы вызываете [self.tableView reloadData] со следующим)
// The UITableView may in rare circumstances all of a sudden failed to render
// correctly. We're not entirely sure why this happens but its something to
// do with multiple threads executing and updating the data behind the view
// which somehow causes the events to stop firing. Resetting the delegate and
// dataSource to self isn't enough to fix things however so we have to
// completely recreate the UITableView and replace the existing one.
UITableView* tempTableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 387)] autorelease];
tempTableView.separatorColor = [UIColor grayColor];
tempTableView.backgroundColor = [UIColor clearColor];
if (self.tableView != nil)
{
[tempTableView setContentOffset:self.tableView.contentOffset animated:NO];
}
tempTableView.delegate = self;
tempTableView.dataSource = self;
[tempTableView reloadData];
if (self.tableView != nil) {
[self.tableView removeFromSuperview];
self.tableView = nil;
}
[self.view addSubview:tempTableView];
self.tableView = tempTableView;
Я знаю, что это не идеальное исправление и на самом деле не объясняет проблему, но я думаю, что это ошибка iOS. Хотелось бы, однако, любой другой вклад.