iOS: cellForRowAtIndexPath не вызывается сразу после numberOfRowsInSection - PullRequest
1 голос
/ 23 февраля 2012

У меня есть нужные данные для текущего раздела внутри numberOfRowsInSection. Затем я ожидаю, что он вызовет cellForRowAtIndexPath, чтобы я мог использовать эти данные.

В моем numberOfRowsInSection я перезаписываю данные из предыдущего раздела. Выполнение NSLog показывает, что numberOfRowsInSection выполняется для всех 149 секций до того, как первый cellForRowAtIndexPath будет вызван ... Почему?

Я удалил вызовы к reloadData, так как увидел, что для кого-то еще здесь была проблема переполнения стека, но это не решило проблему.

За Джима я добавляю то, что я делаю.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{   
    NSMutableArray *tempArray = [NSMutableArray array];
    FMResultSet *appointmentResults = [[DataClass getDB] executeQuery:@"SELECT * FROM Appointments WHERE date = ?",[self.appointmentDates objectAtIndex:section]];
    int rowCount = 0;
    while ([appointmentResults next]) {
        [tempArray addObject:[appointmentResults resultDict]];
        rowCount++;
    }
    self.appointments = tempArray;
    NSLog(@"Appointments: %@ - %i", [self.appointmentDates objectAtIndex:section], rowCount);
    return rowCount;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Parse the appointments for the current section and display them
}

Ответы [ 6 ]

9 голосов
/ 23 февраля 2012

В общем смысле не очень хорошая практика полагаться на то, что Apple вызывает ваши функции-делегаты в каком-либо конкретном шаблоне.

В частности, для UITableView он будет запрашивать данные только по мере необходимости.,UITableView больше нуждается в том, чтобы знать, сколько разделов и строк имеется во всей таблице, чтобы он мог правильно обрабатывать такие вещи, как положение прокрутки и размер полосы прокрутки, в то время как фактическое содержимое ячейки может перемещаться до тех пор, пока они не войдут впредставление пользователя.

Вы не можете принять вызов numberOfRowsInSection, поскольку он подразумевает нечто большее, чем то, что система хочет знать, сколько строк в разделе.:)

2 голосов
/ 23 февраля 2012

Это поведение UITableView.

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

Ячейки, которые не видны, cellForRowAtIndexPath изначально не будут вызываться. Он будет вызван после прокрутки пользователем.

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

У меня тоже такая же ситуация.я думаю, причина в том, что высота строки, возвращаемой таблицей, равна 0.

0 голосов
/ 23 февраля 2012

Если вы хотите обновить / изменить таблицу, вы должны изменить соответствующие данные в model, а затем вызвать один из методов [tableView reload....]; tableView (зависит от того, что именно вы пытаетесь изменить).

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

Когда вы звоните [tableView reload....];, вам будут вызваны ваши методы предоставления контента, и это место для предоставления, ну, в общем, контента.

0 голосов
/ 23 февраля 2012

Так работает класс UITableView ..

Ничего шокировать ... и вы не сможете изменить это ..

Также 149 секций не должнызагружаться сразу .. загружать их как пользователь прокручивает ..

0 голосов
/ 23 февраля 2012

я предполагаю, что uitableview кеширует, что данные проходят один раз и получают все

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