0

私は次の問題を抱えています:

コンテンツとしていくつかのテキストといくつかの画像を含むUITableViewがあります。セルのTextLabelにテキストが表示され、セルのコンテンツビューのサブビューとしていくつかのUIImageViewを含むUIViewを追加します。

いくつかのセルを削除するまで、すべてが正常に機能します。何が起こるかというと、テーブルからセル(最初のセルとしましょう)を削除し、そのデータをリロードすると、たとえば2番目のセルがさらに1つ上に移動します。右側のUIViewには、最初の(削除された)セルのコンテンツが含まれています。

なぜこれが発生するのかわかりませんが、cellForRowAtIndexPathコールバックメソッドに何か問題があると思います。

わかりやすくするために、コードを貼り付けます。

私にできることは、コントローラーをアンロードして再度ロードすることです。そうすると、画像に正しいコンテンツが再び含まれます。

これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {



static NSString *MyIdentifierUNCHECK = @"MyIdentifierUNCHECK";


MyStuff *m = [allObjects objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:MyIdentifierUNCHECK];
    UIView *v;    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
        v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

        v.contentMode = UIViewContentModeScaleAspectFill;
        [v addSubview:[[UIImageView alloc] init]];//some image view
        [cell.contentView addSubview:v];
    }

    cell.textLabel.text = m.name;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:14.0];
    cell.imageView.image = [UIImage imageNamed:@"checkbox.png"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
4

2 に答える 2

2

「右側のビュー」とは、セルに対してuがインスタンス化されるビューを意味すると想定しています...ここでの問題は、セルを再利用し、各セルのUIViewをリセットしないために発生します。同じ問題が発生するのは、次の場合です。スクロールできる十分なセルがあります。セルを再利用するときは、常にダーティデータがあると想定し、正しいデータをリロードする必要があります。この場合、間違いは次のスニペットにあります。

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
    v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

    v.contentMode = UIViewContentModeScaleAspectFill;
    [v addSubview:[[UIImageView alloc] init]];//some image view
    [cell.contentView addSubview:v];
}

最初に割り当てられたときにセル内のビューをインスタンス化するだけなので、これが発生します... 1-最初にすべてのセルを作成し、それらの「正しいビュー」を作成します2-セルを削除します3-2番目のセルの場合システムは、最初のセルとして作成したUITableViewCellを再利用しています4-セルがnilでないため、UIViewは設定されておらず、表示されるのは2番目のセルの最初のセルUIViewです

セルのUIViewをリセットしていないため、期待したものではなく、セルに間違ったビューが表示されています。

これを修正するには、セルを再利用しないことを選択するか、cellForRowAtIndexPathが呼び出されるたびにUIViewを追加するコードを移動することができます。これにより、適切なUIViewに適切なセルが読み込まれます。

于 2010-10-12T14:41:28.227 に答える
0

私は(幸運なことに:))それを理解しました-私は自分のセルのコンテンツからすでに存在していたビューを取得し、そのコンテンツを交換する必要がありました。それが私が最初にそれをタグ付けした理由です....これは私を助けました:

    v = [cell.contentView viewWithTag:PRICE_TAG];
    for (UIView *t in v.subviews) {
        [t removeFromSuperview];
    }
    [v addSubview:[self setupPrice:m.price]];

もっとドキュメントを読む必要があります...

于 2010-10-12T14:40:38.103 に答える