UITableView单元格内容视图中的UIImageView未更新

时间:2012-08-07 13:14:45

标签: iphone uitableview uiimageview

在我的iPhone应用程序中,我有一个UITableView,它包含一个UIImageView,按钮和Label。我正在根据服务器的值更新我的数据库并更新tableview中的详细信息。如果我第二次运行该应用程序,在服务器上进行一些修改后,imageview将不会更新。按钮和标签正在更新。当我从数据库检查图像的本地路径时,它在文档文件夹中显示新图像,但表格单元格仍显示旧图像。要查看更新的图像,我应该重新安装该应用程序。我该怎么做才能解决这个问题?

以下是我所做工作的工作流程:

  1. 从数据库加载新值,并将所有值保留在数组中
  2. 删除tableview
  3. 再次创建tableview
  4. 重新加载tableview。
  5. 修改 //为表格视图创建自定义单元格以显示不同的对象

    - (UIMenuItemCell *) getCellContentView:(NSString *)cellIdentifier {
    
        CGRect CellFrame = CGRectMake(0, 0, 150, 60);
        CGRect Label1Frame = CGRectMake(20, 23, 98, 30);
        CGRect imgFrame = CGRectMake(20, 48, 110, 123);
        CGRect btnFrame = CGRectMake(25, 136, 100, 30);
    
        UILabel *lblTemp;
        UIImageView *itemImg;
        UIButton *itemBtn;
    
        UIMenuItemCell *cell = [[UIMenuItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.frame = CellFrame;
    
        //Initialize Label with tag 1.  
        lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
        lblTemp.tag = 1;
        lblTemp.textColor=[UIColor colorWithRed:139.0f/255.0f green:69.0f/255.0f blue:19.0f/255.0f alpha:1.0f];
        lblTemp.textAlignment = UITextAlignmentCenter;
        lblTemp.backgroundColor = [UIColor clearColor];
        lblTemp.font = [UIFont systemFontOfSize:13.0];
        [cell.contentView addSubview:lblTemp];
        [lblTemp release];
    
        //Initialize ImageView
        itemImg = [[UIImageView alloc]initWithFrame:imgFrame];
        itemImg.tag = 2;
        [cell.contentView addSubview:itemImg];
        [itemImg release];
    
        //Initialize Button
        itemBtn = [[UIButton alloc]initWithFrame:btnFrame];
        itemBtn.frame = btnFrame;
        itemBtn.tag = 3;
        itemBtn.titleLabel.textColor = [UIColor blueColor];
        itemBtn.titleLabel.font = [UIFont systemFontOfSize:9.0];
        [cell.contentView addSubview:itemBtn];
        [itemBtn release];
    
    
        return cell;
    }
    

    //自定义表格视图单元格的外观。

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
    
            NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];
    
            UIMenuItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    
            if(cell == nil){
                cell = [self getCellContentView:CellIdentifier];
    
                cell.transform = CGAffineTransformMakeRotation(M_PI_2);
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
                cell.cellItemName = (UILabel *)[cell viewWithTag:1];
                cell.cellitemImage = (UIImageView *)[cell viewWithTag:2];
                cell.cellItemButton = (UIButton *)[cell viewWithTag:3];
    
                DataBaseClass *itemObj = [appDelegate.itemArray objectAtIndex:indexPath.row];
    
                NSString *imageLocalFilePath = nil;
                if ([[tempitemStatusArray objectAtIndex:indexPath.row] isEqualToString:@"NotAvailable"]) {
                    cell.cellItemProgress.hidden = YES;
                    cell.cellItemButton.hidden = NO;
                    imageLocalFilePath = [NSString stringWithFormat:@"%@",[tempItemLocalNotAvailPath objectAtIndex:indexPath.row]];
                    NSString *date = [self changeDateFormat:itemObj.itemReleaseDate];          
                    [cell.cellItemButton setTitle:date forState:UIControlStateNormal]; 
                    cell.cellItemButton.userInteractionEnabled = NO;
                    cell.userInteractionEnabled = NO;
                    [cell.cellItemButton removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
                    [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"not_available_bttn_bck_img"] forState:UIControlStateNormal];
                }else if ([[tempitemStatusArray objectAtIndex:indexPath.row] isEqualToString:@"Available"]){
                    cell.cellItemButton.userInteractionEnabled = YES;
                    cell.userInteractionEnabled = YES;
                    cell.cellItemProgress.hidden = YES;
                    [cell.cellItemButton setTitle:@"" forState:UIControlStateNormal];
                    [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"available_bttn_img_normal"] forState:UIControlStateNormal];
                    [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"available_bttn_img_pressed"] forState:UIControlStateHighlighted];
                    [cell.cellItemButton removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
                    [cell.cellItemButton addTarget:self action:@selector(confirmationAlert:) forControlEvents:UIControlEventTouchUpInside];
                    imageLocalFilePath = [NSString stringWithFormat:@"%@",[tempItemLocalAvailPath objectAtIndex:indexPath.row]];
                }
                if ([imageLocalFilePath isEqualToString:@""]) {
                    [cell.cellitemImage setImage:[UIImage imageNamed:@"item01.png"]];
                }else {
                    [cell.cellitemImage setImageWithURL:[NSURL fileURLWithPath:imageLocalFilePath] placeholderImage:[UIImage imageNamed:@"item01.png"]];
                }        
                cell.cellItemName.text = [NSString stringWithFormat:@"%@",[tempItemNameArray objectAtIndex:indexPath.row]];
            }
    
            return cell;
        }
    

    请帮忙。

4 个答案:

答案 0 :(得分:3)

我在cellForRowAtIndexPath方法中找到了设置图片的问题,我使用了代码

[cell.cellitemImage setImageWithURL:[NSURL fileURLWithPath:imageLocalFilePath] placeholderImage:[UIImage imageNamed:@"item01.png"]];

我使用外部类调用ImageLoading来加载图像,并且这些类包含了一些缓存方法,并且导致了这个问题。所以我将该行更改为

[cell.cellitemImage setImage:[UIImage imageWithContentsOfFile:imageLocalFilePath]];

解决了这个问题。

感谢您的支持:)

答案 1 :(得分:0)

应该有一个     }

行后

cell.cellItemButton = (UIButton *)[cell viewWithTag:3]; 

答案 2 :(得分:0)

我先看了一下你的代码,我发现了这个“错误”:

   NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];

所以...它不会给你任何错误,它有效...

但这违反了表的工作方式: 这样做是为数组/数据库的每个项目创建和分配一个新单元格, 意思是如果你需要滚动查看1.000项,你创建1.000单元格!!!

它应该不是这样的。

通常情况下,表格只会创建需要在屏幕/显示屏上显示的单元格

意思是如果你的表区域高度为300像素,每个单元格的高度为30像素, 那么你可能只需要11个单元格,你应该只使用/分配11个单元格,而不是1.000

单元格的神奇之处在于当用户将它们滚出屏幕(例如UP)时重复使用单元格,使用新项目数据设置数据和图像并将其再次放在屏幕上(例如DOWN)

这通常是CellIdentifier的用途,对于表中的所有单元格应该是相同的(至少如果所有单元格相似,但包含的数据,并且您不需要不同的单元格)

分配太多的单元格可能会给你带来内存问题,如果你管理的项目太多......

P.S。

我可能没有回答你的问题,你的代码中可能还有其他问题,因为我说我只是匆匆阅读它

答案 3 :(得分:-1)

您必须在从数据库加载数据和tableview重新加载之间保持一些时间延迟。然后,您将能够看到更新的图像。