uitableview reloaddata 缓存?

Posted

技术标签:

【中文标题】uitableview reloaddata 缓存?【英文标题】:uitableview reloaddata cache? 【发布时间】:2012-01-22 16:02:34 【问题描述】:

我在使用 UITableView 和方法 reloadData 时遇到了一些问题。

单击刷新按钮时,我正在刷新 tableView,数据库中的最后一个信息按降序排列,因此最近的项目应该出现在第一个位置。

我的 tableview 中的每个单元格都被自定义标签和 uiimageviews 填充。

嗯...问题是,当我按下刷新按钮并找到新数据时,前 5 行(即显示在显示屏中的行)没有更新,但后面的行会更新。但是,如果我按下前 5 行中的任何一行,它们就会正确调用 tableView:didSelectRowAtIndexPath: 方法并使用新数据。

所以,问题在于 tableview 的前 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;

【问题讨论】:

也许您应该发布您的单元格创建代码? 代码加了,不少,呵呵!谢谢 【参考方案1】:

嗯,所以你给每个单元格一个唯一的单元格标识符。你有这样做的理由吗? 大多数人都试图通过这种方式来修补他们对 iOS 表格视图的误解......

当您重新加载表格时,此调用 UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 将为您提供一个可重复使用的单元格(读取已包含内容)。

但是您的代码仅适用于“新鲜”单元格:if (cell == nil) ,您只是没有为这种情况做好准备......

【讨论】:

哇!不知道,我不必重复使用这些单元格。这解决了我的问题!非常感谢!

以上是关于uitableview reloaddata 缓存?的主要内容,如果未能解决你的问题,请参考以下文章

为啥UITableView不能reloadData

UITableView.reloadData() 没有刷新 tableView。没有错误信息

UITableView 的 reloadData() 的替代方案?

UIView 与 UITableview 和 UIImageview,使用 reloadData 访问 UITableview

UITableView 强制 sectionIndex 更新而不调用 reloadData

iOS UITableView reloadData 刷新结束后执行后续操作