0

私のiPhoneアプリケーションには、がありUITableView、これにはUIImageView、ボタン、およびラベルが含まれています。サーバーからの値に従ってデータベースを更新し、テーブルビューの詳細を更新しています。サーバーでいくつかの変更を行った後、アプリを2回実行すると、imageviewが更新されません。ボタンとラベルが更新されています。データベースから画像のローカルパスを確認すると、ドキュメントフォルダに新しい画像が表示されますが、テーブルセルには古い画像が表示されたままです。更新された画像を表示するには、アプリを再インストールする必要があります。この問題を解決するにはどうすればよいですか?

これが私がしたことのワークフローです:

  1. データベースから新しい値をロードし、すべての値を配列に保持する
  2. テーブルビューの削除
  3. テーブルビューを再度作成する
  4. テーブルビューをリロードします。

編集 //さまざまなオブジェクトを表示するためのテーブルビューのカスタムセルを作成する

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

あるはずです }

行の後

cell.cellItemButton = (UIButton *)[cell viewWithTag:3]; 
于 2012-08-07T13:37:07.087 に答える
0

私はジェット機であなたのコードを最初に調べました、そして私はこの「エラー」を見つけました:

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

だから...それはあなたにエラーを与えません、それは動作します...

ただし、これはテーブルの動作に反します。これを行うと、配列/データベースの各アイテムに新しいセルを作成して割り当てます。つまり、スクロールして1.000アイテムを表示する必要がある場合は、1.000セルを作成します。

このようなものであってはなりません。

通常、テーブルは画面/ディスプレイに表示する必要のあるセルのみを作成します

つまり、テーブル領域の高さが300ピクセルで、各セルの高さが30ピクセルの場合、必要なセルは11個だけであり、1.000ではなく11個のセルのみを使用/割り当てる必要があります。

セルの魔法は、ユーザーがセルを画面外にスクロールしたときにセルを再利用し(UPなど)、データと画像に新しいアイテムデータを設定し、再び画面に表示することです(DOWNなど)。

これがCellIdentifierの通常の使用目的であり、テーブル内のすべてのセルで同じである必要があります(少なくとも、すべてのセルが類似しているが、含まれているデータであり、異なるセルは必要ない場合)

あまりにも多くのセルを割り当てると、管理するアイテムが多すぎる場合にメモリの問題が発生する可能性があります...

ps

私はおそらくあなたの質問に答えていません、私が急いでそれを読んだと言ったので、あなたのコードに他の問題があるかもしれません

于 2012-08-07T14:09:11.497 に答える
-1

databseからのデータのロードとテーブルビューのリロードの間には、ある程度の時間遅延を保つ必要があります。その後、更新された画像を見ることができます。

于 2012-08-07T13:28:17.707 に答える