NumberOfRowsInSection: не вызывается для reloadData

У меня есть UITableView, который использует массив для отображения данных. Это прекрасно работает. У меня также есть UISearchBar для поиска в этой таблице. Когда данные сопоставляются в массиве tableviews, эти строки добавляются в другой изменяемый массив, а cellForRowAtIndexPath: вместо этого отображает данные из этого изменяемого массива.

Но numberOfRowsInSection: никогда не вызывается, когда я вызываю reloadData. Поэтому tableview падает при прокрутке, поскольку пытается получить данные из изменяемого массива, но для строк, которые находятся в исходном массиве (у которого больше элементов)

Я отлаживал довольно долгое время, но не могу ради любви найти причины этого. Datasource и Delegate подключены в представлении таблицы, поскольку он может отображать данные из исходного массива.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     NSLog(@"isSearching: %d", isSearching);
     // Return the number of rows in the section.
     if(!isSearching)
        return [originalArray count];

     NSLog(@"isSearching - Return searchCopyListOfItems");
     return [searchCopyListOfItems count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *CellIdentifier = @"Cell";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

     if(cell == nil) {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
     }

     if(!searching)
         cell.textLabel.text = [originalArray objectAtIndex:indexPath.row];
     else
         cell.textLabel.text = [searchCopyListOfItems objectAtIndex:indexPath.row];

     return cell;
}

Ответ 1

как вы перезагружаете таблицу? делать [table relaodData]; вправо? ваша таблица подключена к IBOutlet на вашем наконечнике? в точке перезагрузки, инициализируется table?

вы также можете опубликовать информацию об аварии.

Ответ 2

Обязательно не вызывать reloadData из любого из методов делегата представления таблицы. Это приведет к непредсказуемому поведению. Кроме того, убедитесь, что вы ранее не вызывали beginUpdates, и вы вызываете только ваш метод reloadData из основного потока.

Ответ 3

если numberOfSections возвращает 0, numberOfRowsInSection не будет вызываться.

Ответ 4

У меня была такая же проблема сегодня с XCode 6.1

В моем коде у меня были настройки dataSource и delegate:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.tableView.dataSource = self;
    self.tableView.delegate = self;
}

... и, как ни странно, мой код заполнил бы таблицу при первой загрузке... но затем проигнорировал любые вызовы reloadData.

В раскадровке, когда я щелкнул правой кнопкой мыши по представлению таблицы в раскадровке, переключатель "outlet" был пустым.

Я перетащил строку из этого пустого круга в родительский UIView, а затем reloadData работал нормально.

enter image description here

Как-то я потерял связь IBOutlet между моим элементом управления UITableView и файлами .h/.m, которые были использованы для его заполнения.

Ответ 5

Также убедитесь, что вы не перемещаете таблицу в процессе перезагрузки данных, потому что она может вызвать cellForRowAtIndexPath: пока вы все еще обновляете свои данные.

Ответ 6

Проблема для меня заключалась в том, что вырезанное количество разделов возвратило 0, и хотя я не планировал использовать разделы, должно быть 1, как это выше в иерархии объектов, чем строки: fooobar.com/questions/531743/...

Ответ 7

Для меня было получено, что я пытался увеличить значение и вернуть его из numberOfSectionsInTableView

то есть. return someValue++

По-видимому, это невозможно, и в моем случае он не увеличивал someValue от 0 до 1 и поэтому возвращал 0 разделов, поэтому не было причин для вызова numberOfRowsInSection:!

Ответ 8

Решением для меня было то, что я скопировал его из другого пера и забыл перемонтировать dataSource и delegate выходы в IB. Это уже случалось со мной раньше, но я решил опубликовать это здесь на случай, если это решение поможет тем, кто сталкивается с этой проблемой.

Ответ 9

Попробуйте

[self.tableView reloadData];