кеш перезагрузки данных uitableview?

У меня возникли проблемы с UITableView и методом reloadData.

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

Каждая ячейка в моем табличном представлении заполняется пользовательскими метками и представлениями uiimage.

Ну... дело в том, что когда я нажимаю эту кнопку обновления и обнаруживаются новые данные, первые 5 строк (которые отображаются на дисплее) не обновляются, но обновляются следующие строки. Однако, если я нажму на любую из 5 первых строк, они правильно вызовут метод tableView:didSelectRowAtIndexPath: с новыми данными.

Итак, проблема в том, что «визуальное» содержимое таблицы первых 5 строк не обновляется.

Кто-нибудь может помочь мне с этим?

Спасибо!

Код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [ NSString stringWithFormat: @"%d:%d", [ indexPath indexAtPosition: 0 ], [ indexPath indexAtPosition:1 ]];

    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: CellIdentifier] autorelease];

        // Configure the cell...
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        Activity *activity = [[self.activities valueForKey:[[[self.activities allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
        cell.textLabel.text=@"";
        //Mostramos el nombre
        UILabel *label= [[UILabel alloc] initWithFrame:CGRectMake(60, -5, 200, 34)];
        label.text = [activity name];
        label.font = [UIFont boldSystemFontOfSize:17];
        label.backgroundColor = [UIColor clearColor];
        [cell addSubview:label];
        [label release];

        //Mostramos la imagen
        UIImageView *leftImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 3, 50, 50)];
        [cell addSubview:leftImage];


        UITextView *textView=[[UITextView alloc] initWithFrame:CGRectMake(60, 25, 200, 38)];
        textView.editable = NO;
        textView.backgroundColor = [UIColor clearColor];
        textView.textColor = [UIColor grayColor];
        textView.font = [UIFont systemFontOfSize:12.0];
        textView.contentInset = UIEdgeInsetsMake(-8,-8,0,0);
        textView.userInteractionEnabled=NO;
        [cell addSubview:textView];

        switch ([activity notType]) {
            case 0:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"requestPUSH",@""),[activity name]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 1:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPCreatedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"mpNew.png"];
                break;
            case 2:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPUpdatedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"mpUpdated.png"];
                break;
            case 3:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPDeletedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 4:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestConfirmationPUSHString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"attend.png"];
                break;
            case 5:
                if ([[activity message] isEqualToString:@"noData"]) {
                    textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushString",@""),[activity name]];
                }else{
                    textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushStringWithData",@""),[activity name], [activity message]];
                }
                UIImage *contactImage = [UIImage imageWithData:[[activity person] pic]];
                if (contactImage!=nil) {
                    leftImage.image = contactImage;
                    //redondeamos bordes
                    CALayer * l = [leftImage layer];
                    [l setMasksToBounds:YES];
                    [l setCornerRadius:5.0];
                }else{
                    leftImage.image = [UIImage imageNamed:@"ios.png"];
                }
                break;
            case 6:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"CheckinPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 7:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestRejectionPUSHString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"reject.png"];
                break;
            default:
                break;
        }
        [leftImage release];
        [textView release];


        //Mostrar fecha
        double timestamp = [[activity datetime] doubleValue]/1000;
        NSString *dateShow;

        NSDate *datetime = [NSDate dateWithTimeIntervalSince1970:timestamp];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"HH:mm"];
        dateShow=[dateFormat stringFromDate:datetime];

        UILabel *label2= [[UILabel alloc] initWithFrame:CGRectMake(240, 0, 70, 20)];
        label2.text = dateShow;
        label2.textAlignment = UITextAlignmentRight;
        label2.font = [UIFont systemFontOfSize:12];
        label2.backgroundColor = [UIColor clearColor];
        label2.textColor = [UIColor blueColor];
        [cell addSubview:label2];
        [label2 release];

    }

    return cell;
}

person Ibai    schedule 22.01.2012    source источник
comment
Может быть, вам стоит опубликовать свой код создания ячейки?   -  person Tom    schedule 22.01.2012
comment
Код добавлен, его не мало, хе-хе! Спасибо   -  person Ibai    schedule 22.01.2012


Ответы (1)


Хм, так вы даете каждой ячейке уникальный идентификатор ячейки. У вас есть причина для этого? В основном люди пытаются исправить свое непонимание табличных представлений iOS таким образом...

Когда вы перезагрузите свою таблицу, этот вызов UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier]; даст вам ячейку для повторного использования (чтение уже содержит содержимое).

Но ваш код работает только для «свежих» ячеек: if (cell == nil) { , вы просто не готовы к этому случаю...

person Tom    schedule 22.01.2012
comment
Вау! Не знал об этом, мне не нужно повторно использовать ячейки. Это решило мою проблему! Большое тебе спасибо! - person Ibai; 22.01.2012