UITableView reloadData - cellForRowAtIndexPath не запущен - PullRequest
8 голосов
/ 12 августа 2010

У меня есть splitViewController, который имеет в качестве MasterViewController некоторый viewController и в качестве DetailViewController некоторый tableViewController.Когда я нажимаю кнопку на masterViewController, я хочу показать новый tableViewController в detailViewController вместо существующего.

Итак, я сделал так:

SearchDetailViewController *searchDetailViewController = [[SearchDetailViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *searchDetailNavigationController = [[UINavigationController alloc] initWithRootViewController:searchDetailViewController];

После этого я передаю данные для отображенияв новом tableController:

[searchDetailViewController passInSearchResults:listOfItems];

После этого я "толкаю" новые контроллеры в splitViewController:

[searchSplitViewController setViewControllers:[NSArray arrayWithObjects:self.navigationController, searchDetailNavigationController, nil]];

В целевом методе tableViewController "passInSearchResults" данные передаются, и я также вызываю reloadData.Метод выглядит следующим образом:

- (void)passInSearchResults:(NSMutableDictionary *)searchResults {
    self.searchResultList = searchResults;
    NSLog(@"Data is passed in: %@",self.searchResultList);
    [self.tableView reloadData];
    //[self.tableView setNeedsDisplay];
}

Консоль: данные передаются в: [здесь я получаю точные данные, которые мне нужны, и кажется, что это правильно].

After this I see that method "numberOfRowsInSection" is fired:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"Setting table length: %i",[self.searchResultList count]);
    return [self.searchResultList count];
}

Консоль: таблица настроекдлина: [здесь я получаю правильную длину]

Проблема в том, что таблица не заполнена переданными данными, и метод "cellForRowAtIndexPath" не вызывается.

Как это может быть в методе reloadData"numberOfRowsInSection" запускается, но не вызывается методом "cellForRowAtIndexPath" ... ???

Спасибо

Ответы [ 7 ]

10 голосов
/ 09 июля 2012

Проверьте, находитесь ли вы в главном потоке при звонке [self.tableView reloadData];

- (void)passInSearchResults:(NSMutableDictionary *)searchResults {
 if ([NSThread isMainThread]) {
    self.searchResultList = searchResults;
    NSLog(@"Data is passed in: %@",self.searchResultList);
    [self.tableView reloadData];
}
else {
    [self performSelectorOnMainThread:@selector(passInSearchResults:) searchResults waitUntilDone:NO];
}

}

4 голосов
/ 11 ноября 2012

Проверьте ваш numberOfRows, если он равен 0, ячеек нет для отображения.

4 голосов
/ 21 апреля 2011

Как может случиться так, что при reloadData метод "numberOfRowsInSection" запускается, но не метод "cellForRowAtIndexPath" ... ???

Проведя день с той же (ish) проблемой, я думаю, что мы нашли ошибку здесь. Я нашел хак / обходной путь, хотя.

Если я изменяю массив (добавление / удаление значений или полное его построение), который используется в моем методе cellForRowAtIndexPath, кажется, что он снова корректно вызывает cellForRowAtIndexPath при перезагрузке данных.

Например, в моем cellForRowAtIndexPath у меня есть что-то вроде:

cell.textLabel.text = [[[self.searchResultsArrayWithSections objectAtIndex:indexPath.section] objectForKey:@"rowValues"] objectAtIndex:indexPath.row];

    return cell;

У меня также есть метод для создания этого массива, который вызывается для viewDidLoad:

    - (NSMutableArray *)splitIntoSectionsWithAlphabet:(NSMutableArray *)myArray 
{    
NSString *letters = @"abcdefghijklmnopqrstuvwxyz";
NSMutableArray *content = [NSMutableArray new];

//code to build array here, nothing special really

return content;
}

Итак, я заметил, что если я специально вызову этот метод снова в моем массиве searchResultsArrayWithSections перед вызовом reloadData, он на самом деле правильно вызывает все методы UITableViewDelegate! (как я уже сказал, взломать, но это работает!)

//dirty hack, bug with cancel button and not realoding data, seems we have to modify this array before it will work correctly
self.customerListArrayWithSections = [self splitIntoSectionsWithAlphabet:self.customerListArray];
[self.customerListTv reloadData];
3 голосов
/ 11 марта 2016

В моем случае проблема заключалась в том, что функция reloadData () не была вызвана из основного потока .

Я изменил это, поместив его в функцию dispatch_async () , которая решила проблему:

dispatch_async(dispatch_get_main_queue(), {
    self.tableView.reloadData()
})

Надеюсь, это поможет другим.

1 голос
/ 20 декабря 2011

У меня была такая же проблема, но решение было очень простым.Прежде всего, вы могли бы попытаться прокрутить таблицу вниз?tableView: cellForRow ... должен быть вызван.Проверьте высоту заголовков и contentOffset для tableView.

0 голосов
/ 30 марта 2015

My " AutoLayouted " UITableView не вызывал cellForRowAtIndexPath для reloadData, потому что я по ошибке установил кадр.

_tableView = [[UITableView alloc] initWithFrame:self.view.frame];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;

При изменении его на CGRectZero это работало ..

_tableView = [[UITableView alloc] initWithFrame:CGRectZero];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;
0 голосов
/ 19 февраля 2013

Также вы можете размещать таблицу в методе init [With ...] viewController, а также подключать то же свойство в IB.Таким образом, возможно, что методы numberOf ... делегата вызываются, а cellForRow ... нет.

...