cellForRowAtIndexPath иногда не вызывается после вызова numberOfRowsInSection при вызове reloadData - PullRequest
5 голосов
/ 05 мая 2011

У меня есть простое приложение, в котором у меня есть представление таблицы и в зависимости от обратного вызова с массивом я перезагружаю данные таблицы, используя метод reloadData. Первоначально для первых 5-10 раз загрузки это табличное представление работает без каких-либо проблем. После игры с приложением иногда я замечал, что табличное представление пустое из-за причины, по которой cellForRowAtIndexPath не вызывается платформой. Я проверил, что datasource & delegate установлено правильно и numberOfRowsInSection возвращает действительное положительное число. Как только я вижу пустое табличное представление, я могу видеть это пустое представление несколько раз, пока не выйду из приложения. Я не получаю никаких ошибок или предупреждений в консоли. Я пытался настроить массив, но безрезультатно.

Вот код:

- (void)notifyArrayLoaded:(NSArray *)arr {
    NSUInteger capacity = [arr count];
    _tbDataArray = [[NSMutableArray alloc] initWithCapacity:capacity];

    // _tbDataArray is filled with the data from arr

    // Reload the table data
    [_tableView reloadData]; 
}

Любая подсказка будет высоко оценена.

Заранее спасибо. Sumit

Привет, ДинВомбурн, у меня нет метода viewDidUnLoad, но у меня есть метод viewWillDisAppear, который я публикую здесь.

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
    [self.navigationController setNavigationBarHidden:NO animated:NO];

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];

    view.transform = CGAffineTransformIdentity;
    view.transform = CGAffineTransformMakeRotation(0);
    view.bounds = CGRectMake(0.0, 0.0, 320, 480);
}

Это журналы tableView как зарегистрированные.

[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
<UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>

Ответы [ 5 ]

10 голосов
/ 09 августа 2011

Убедитесь, что вы вызываете reloadData в главном потоке. Если вы загружаете свои данные асинхронно, используя performSelectorInBackground и вызывая reloadData в этом методе, вы должны вместо того, чтобы делать что-то вроде:

[tableViewController reloadData]

Что вы должны делать, это

[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]
5 голосов
/ 20 мая 2011

Если reloadData вызывает numberOfRowsInSection для вызова, но не cellForRowAtIndexPath, убедитесь, что экземпляр UITableView, который вы назвали reloadData, совпадает с UITableView, который вы отображали в своем представлении, например,

NSLog(@"Calling reloadData on %@", self.tableView);
[self.tableView reloadData];

Я думаю, вы обнаружите, что у вас есть два разных UITableViews.Тогда загадка проясняется, почему ...

0 голосов
/ 19 июня 2014

У меня тоже были такие же симптомы. В моем случае, когда я впервые загружал данные (из основных данных) в viewDidLoad, для сортировки данных использовался NSSortDescriptor.

При нажатии кнопки базовые данные были извлечены снова (на этот раз с изменениями) и данные TableView были перезагружены. Изначально после нажатия кнопки мне показывалось пустое табличное представление, потому что я забыл отсортировать данные при втором извлечении.

Очки обучения: не забывайте вызывать все методы, которые изменяют ячейку, например NSSortDescriptor, если вы использовали их в начале!

0 голосов
/ 26 марта 2014

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

Короче говоря, ответ "Флориана Сеггингера" был верным.

Моя ситуация была 1.calling веб-службы асинхронно, чтобы получить данные (тянуть, чтобы обновить) 2. Пока это обрабатывалось, переместился на другой контроллер представления (выдвинут) 3. Возвратился обратно, и мое приложение упало.

Так между шагами 2 и 3Я заметил, что количество строк и количество разделов для таблицы на самом деле вызывается, а ячейка для строки - нет. Оно возобновляется, когда я возвращаюсь назад к тому моменту, когда количество табличных ячеек изменилось из-за другой логики.видно, что соединение завершило загрузку, так как я перезагружал таблицу, так как появится представление. Это может быть связано с тем, что ячейка для строки на самом деле является действием рендеринга (UI), которое должно выполняться в главном потоке.

0 голосов
/ 02 июня 2011

перейдите в файл заголовка viewcontroller и добавьте (IBOutlet) к элементу tableView. затем подключите через интерфейс

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