cellForRowAtIndexPath: не вызывается - PullRequest
66 голосов
/ 10 октября 2011

Мое приложение имеет два состояния: вошел в систему и не вошел в систему, и у меня есть следующая архитектура (значительно упрощенная):
- ViewController A, который содержит поле поиска и табличное представление.
- ViewController B, которыйиспользуется для входа в приложение.

Поток следующий:
- пользователь не вошел в систему;
- A помещается в стек.В viewWillAppear я проверяю, вошел ли пользователь в систему и, если да, выполняется асинхронный сетевой запрос, и, как только это будет сделано, таблица загружается данными из сети.Однако, поскольку пользователь не вошел в систему на этом этапе, табличное представление пусто;
- пользователь нажимает на поле поиска;поскольку он не вошел в систему, B нажимается (после подтверждения);
- он успешно входит в систему B, затем нажимает кнопку, которая выдает B и снова показывает A;
- в этот момент времени, потому что онвошел в систему, с viewWillAppear я делаю асинхронный запрос;
- когда это будет выполнено, я вызываю reloadData в табличном представлении.

Я замечаю, что numberOfRowsInSection: вызывается ивозвращает правильный результат, однако cellForRowAtIndexPath: впоследствии НЕ вызывается, и таблица остается пустой.

Я проверил, и reloadData вызывается в главном потоке.

Любая идея, что можетэто будет?Потому что это сводит меня с ума!

Спасибо,
S.

РЕДАКТИРОВАТЬ: Вот асинхронный бит кода из viewWillAppear в A.

if ([User isLoggedIn]) {
    [self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        if (error) {
            [Utils displayError:error];
        } else {
            self.array = response;

            self.isLoaded = YES;
            [self.tableView reloadData];
            [self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO];
        }
    }];
}

Iпроверил, что асинхронный запрос успешно завершен и что response содержит правильные данные (это массив, используемый для поддержки UITableView).

После reloadData я установил точку останова в tableView:numberOfRowsInSection:, и она останавливается там, и возвращает правильное количество элементов в array.Однако после этого точка останова в tableView:cellForRowAtIndexPath: никогда не будет достигнута.

Ответы [ 20 ]

1 голос
/ 14 ноября 2013

Я использую ReactiveCocoa.Итак, я создал модель для табличного представления.Данные были подготовлены для отображения, поэтому был вызван numberOfRows и так далее.Но я не добавил табличное представление как подпредставление, поэтому cellForRowAtIndexPath не было вызвано)))

1 голос
/ 30 марта 2014
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Make sure self.data isn't nil!
    // If it is, you'll always return 0 and therefore
    // cellForRowAtIndexPath will never get called.
    return [self.data count]; 
}
0 голосов
/ 02 мая 2016

Я решил ту же проблему, проверив идентификатор tableViewCell. Зайдите в Атрибуты Инспектора и посмотрите раздел идентификатора. Вероятно, отсутствует. Поэтому напишите идентификатор ячейки.

0 голосов
/ 25 ноября 2017

Ни один из ответов здесь не помог мне.

Я использовал выполнение своих ограничений программно, но забыл написать:

myTableView.translatesAutoresizingMaskIntoConstraints = false
0 голосов
/ 16 ноября 2017

У меня та же проблема, у меня есть использование Table View внутри StackView и отключение прокрутки табличного представления и установка ограничения высоты, но после этого

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

Не работает, перестать вызывать этот метод все Data Source и Delegateустановлен правильно.

если у вас есть та же проблема, что и для решения, установленного в таблице, снизу, впереди, в конце, ограничение

enter image description here

0 голосов
/ 05 апреля 2017

Тот же случай, но это была ошибка:

Я включил Scrollview с двумя таблицами ViewView внутри ViewController (требования к дизайну), в контроллере scrollview я создал ViewControllers (который содержит TableViews) программно и использовал слабую переменную для ее хранения, плохая идея , потому что они были выпущены в конце метода viewDidLoad.

Если вы не видите содержимое таблицы, пожалуйста, проверьте, было ли оно выпущено.

Моя ошибка была очень болезненной для меня, потому что были вызваны все методы (делегат и источник данных), кроме viewForCell ...

0 голосов
/ 27 марта 2013

Попробуйте вставить новые строки вручную вместо [self.tableView reloadData]:

[self.tableView beginUpdates];
    for (int i = 0; i < responseArray.count; i++) {
        _rowsNumber += 1;
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    }
[self.tableView endUpdates];

В методе dataSource возвращаемое значение увеличивается int _rowsNumber:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _rowsNumber;
}
0 голосов
/ 24 марта 2019

Если вы используете автоматическое расположение, как я, и добавляете просмотр таблицы в представление вашего контроллера представления, убедитесь, что вы добавили эту строку при выделении представления таблицы.

tableView?.translatesAutoresizingMaskIntoConstraints = false

Глупая ошибка с моей стороны.

0 голосов
/ 25 июня 2019

Убедитесь, что ваши ограничения верны и ни одно из них не будет удалено во время сборки.

0 голосов
/ 10 октября 2011

Вы уверены, что после того, как пользователь вошел в систему и выдал B, метод viewWillAppear в A вызывается для выполнения обновления?

Если вы показываете B как модальный контроллер, то когда вы его отклоните, у вас не будет вызван метод viewWillAppear.

Насколько я знаю, viewWillAppear/viewDidAppear (и тому подобное) - это события, генерируемые UINavigationController в случае событий навигации (push / pop viewcontrollers). Так что, возможно, именно поэтому вы, в конце концов, получите свое обновление, когда выйдете из A и вернетесь ... все зависит от способа отображения следующего viewcontroller.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...