3

セルの内容をカスタマイズするために、実装でCell.ContentViewを使用しました。正常に動作しますが、唯一の問題は、セルが多数あり、それらを上下にスクロールすると、セルの内容がセルに上書きされ、非表示になってから表示されることです。最初のセルを上にスクロールしてからもう一度下にスクロールすると、最後のセルの内容が最初のセルに上書きされます。

私はこれについて十分にデバッグしましたが、正確な解決策を見つけることができませんでした。Cell.ContentView.SubViewsカウントをチェックしてみましたが、0の場合は、他のサブビューのみを追加します。セルの内容は上下にスクロールするまで表示されませんが、内容が表示されると上書きされません。少し奇妙です。また、セルを正しく再利用して使用していることを確認しました。以下は、セルのコンテンツビューにサブビューを追加する私のコードです。この問題を解決するにはどうすればよいか教えてください。

PS:私が行った変数や計算について心配する必要はありません。正しい値を返すと仮定します。:)

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSInteger totalAvailableSpace = IPHONE_DISPLAY_WIDTH - iconSize - accesorySize - 10;
    NSInteger lableHeight = [[cellDetails objectForKey:@"TableItemTextFontSize"] intValue] * 2 + 10;

    UILabel *textLabel = nil;
    textLabel = [[[UILabel alloc] initWithFrame:CGRectMake(iconSize+12, self.tableCellHeight/2 - lableHeight/2, totalAvailableSpace * 0.8, lableHeight)] autorelease];
    textLabel.numberOfLines = 2;
    textLabel.lineBreakMode = UILineBreakModeWordWrap;
    textLabel.textAlignment = UITextAlignmentLeft;
    textLabel.text = [cellDetails objectForKey:@"TableItemMainText"];
    if ([textLableColor scanHexInt:&hex]) {
        textLabel.textColor = UIColorFromRGB(hex);
    }
    textLabel.font = [UIFont fontWithName:[cellDetails objectForKey:@"TableItemTextFontName"] size:[[cellDetails objectForKey:@"TableItemTextFontSize"] intValue]]; 
    [cell.contentView addSubview:textLabel];
    textLabel.backgroundColor = [UIColor clearColor];

    lableHeight = [[cellDetails objectForKey:@"TableItemDetailTextFontSize"] intValue] * 2 + 10;
    UILabel *detailTextLabel = nil;
    detailTextLabel = [[[UILabel alloc] initWithFrame:CGRectMake(iconSize+10+totalAvailableSpace * 0.8+5, self.tableCellHeight/2 - lableHeight/2, totalAvailableSpace * 0.2 - 10, lableHeight)] autorelease];
    detailTextLabel.numberOfLines = 2;
    detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
    detailTextLabel.textAlignment = UITextAlignmentLeft;
    detailTextLabel.text = [cellDetails objectForKey:@"TableItemDetailText"];
    if ([detailTextLableColor scanHexInt:&hex]) {
        detailTextLabel.textColor = UIColorFromRGB(hex);
    }
    detailTextLabel.font = [UIFont fontWithName:[cellDetails objectForKey:@"TableItemDetailTextFontName"] size:[[cellDetails objectForKey:@"TableItemDetailTextFontSize"] intValue]];
    [cell.contentView addSubview:detailTextLabel];
    detailTextLabel.backgroundColor = [UIColor clearColor];

    return cell;
}

ありがとう。

4

5 に答える 5

6

これは、おもちゃがセルにビューを何度も追加しているためです。

セルを作成するときにのみ追加し、セルを再利用するときにラベルを設定する必要があります。

ラベルにタグを設定して、後でテキストを設定できるようにすることができます。以下のコードはトリックを行います

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        if(style == UITableViewCellStyleValue1)
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        else
            cell = [[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:CellIdentifier] autorelease];


        NSInteger totalAvailableSpace = IPHONE_DISPLAY_WIDTH - iconSize - accesorySize - 10;
        NSInteger lableHeight = [[cellDetails objectForKey:@"TableItemTextFontSize"] intValue] * 2 + 10;

        UILabel *textLabel = nil;
        textLabel.tag = 1;
        textLabel = [[[UILabel alloc] initWithFrame:CGRectMake(iconSize+12, self.tableCellHeight/2 - lableHeight/2, totalAvailableSpace * 0.8, lableHeight)] autorelease];
        textLabel.numberOfLines = 2;
        textLabel.lineBreakMode = UILineBreakModeWordWrap;
        textLabel.textAlignment = UITextAlignmentLeft;
        textLabel.text = [cellDetails objectForKey:@"TableItemMainText"];
        if ([textLableColor scanHexInt:&hex]) {
            textLabel.textColor = UIColorFromRGB(hex);
        }
        textLabel.font = [UIFont fontWithName:[cellDetails objectForKey:@"TableItemTextFontName"] size:[[cellDetails objectForKey:@"TableItemTextFontSize"] intValue]]; 
        [cell.contentView addSubview:textLabel];
        textLabel.backgroundColor = [UIColor clearColor];

        lableHeight = [[cellDetails objectForKey:@"TableItemDetailTextFontSize"] intValue] * 2 + 10;
        UILabel *detailTextLabel = nil;
        detailTextLabel.tag = 2;
        detailTextLabel = [[[UILabel alloc] initWithFrame:CGRectMake(iconSize+10+totalAvailableSpace * 0.8+5, self.tableCellHeight/2 - lableHeight/2, totalAvailableSpace * 0.2 - 10, lableHeight)] autorelease];
        detailTextLabel.numberOfLines = 2;
        detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
        detailTextLabel.textAlignment = UITextAlignmentLeft;
        detailTextLabel.text = [cellDetails objectForKey:@"TableItemDetailText"];
        if ([detailTextLableColor scanHexInt:&hex]) {
            detailTextLabel.textColor = UIColorFromRGB(hex);
        }
        detailTextLabel.font = [UIFont fontWithName:[cellDetails objectForKey:@"TableItemDetailTextFontName"] size:[[cellDetails objectForKey:@"TableItemDetailTextFontSize"] intValue]];
        [cell.contentView addSubview:detailTextLabel];
        detailTextLabel.backgroundColor = [UIColor clearColor];

    } else {

        UILabel *textLabel = (UILabel *)[cell viewWithTag:1];
        textLabel.text = [cellDetails objectForKey:@"TableItemMainText"];

        UILabel *detailTextLabel = (UILabel *)[cell viewWithTag:2];
        detailTextLabel.text = [cellDetails objectForKey:@"TableItemDetailText"];

    }

    return cell;
}
于 2011-06-16T11:13:12.263 に答える
4
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
}

それを確認しdequeueReusableCellWithIdentifierreuseIdentifiernil

今それは動作します!!

于 2012-10-03T10:08:50.333 に答える
2

すべてのセルUIコンテンツをif(cell == nil){uilabel、uilabelまたはanythingUI関連}内に配置します...セルの作成時にuiを1回だけ呼び出す必要があるため

于 2011-06-16T11:20:44.277 に答える
2

明確にするために、あなたの問題は、セルをスクロールして表示すると、画面外にスクロールしたばかりのセルの上に新しいセルのテキストが書き込まれることがよくあるということです。

問題はdequeueReusableCellWithIdentifier:、セルを「クリーンアップ」しないことです(呼び出しますがprepareForReuse、それだけです)。そのため、古いサブビューはすべてそのまま残ります。セルを再利用する場合は、これらのサブビューを毎回再作成する必要はありません。代わりに、元のセルの既存のサブビューのプロパティを調整dequeueReusableCellWithIdentifier:し、新しく割り当てられたセルにのみ新しいサブビューを作成します。UITableViewCellをサブクラス化すると、これらのサブビューへの参照を保持するためのプロパティ/アイバーを提供し、サブビューの作成と更新を適切なメソッドに移動することでコードを少し整理するのに役立ちます。または、再利用識別子にnilを渡すことで、セルを再利用できませんでした。

上下にスクロールするまでコンテンツが表示されなかった最も可能性の高い理由は、新しく作成されたセルにフレームワークが提供するテキストフィールドと画像ビューがあり、フレームワークがあなたがいないと判断した場合に削除される可能性があるためです。実際にそれらを使用します。

于 2011-06-16T11:21:11.427 に答える
0

iOS5UILineBreakModeWordWrapでは非推奨です。NSLineBreakByWordWrapping代わりに使用する必要があります。

これにより、コードがとのように変更されdetailTextLabel.lineBreakMode = NSLineBreakByWordWrappingますtextLabel.lineBreakMode = NSLineBreakByWordWrapping

于 2013-06-26T15:55:11.070 に答える