0

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

这是我所做的工作流程:

  1. 从数据库加载新值,并将所有值保存在数组中
  2. 删除表格视图
  3. 再次创建表视图
  4. 重新加载表格视图。

Edit //为表格视图创建自定义单元格以显示不同的对象

- (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

4 回答 4

3

我发现了问题,在cellForRowAtIndexPath设置图像的方法中,我使用了代码

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

我使用外部类调用ImageLoading来加载图像,并且该类包含一些缓存方法,这导致了问题。所以我把那条线改成

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

解决了这个问题。

谢谢你的支持 :)

于 2012-08-21T06:36:19.987 回答
0

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

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

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

但这与表格的工作方式背道而驰:这样做您正在为数组/数据库的每个项目创建并分配一个新单元格,这意味着如果您需要滚动查看 1.000 个项目,则创建 1.000 个单元格!!!

它不应该是这样的。

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

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

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

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

如果您管理太多项目,分配太多单元格可能会给您带来记忆问题......

ps

我可能没有回答您的问题,您的代码中可能还有其他问题,正如我所说,我只是匆忙阅读

于 2012-08-07T14:09:11.497 回答
0

应该有一个 }

行后

cell.cellItemButton = (UIButton *)[cell viewWithTag:3]; 
于 2012-08-07T13:37:07.087 回答
-1

您将不得不在从数据库中加载数据和重新加载表格视图之间保留一些时间延迟。然后,您将能够看到更新的图像。

于 2012-08-07T13:28:17.707 回答