2

私はUITableViewそれぞれUITableViewCellにがありUIView、それ以上UIViewに2つと2つUIButtonありUILabelます。私の問題は、テーブルビューをリロードしているときに新しいデータが古いデータに書き直され、コンテンツがぼやけて不明瞭になり、方法cellForRowAtIndexPathでラベルを削除するこのコードを使用した場合、それも正しく機能していません.......

NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
    for (UILabel *subview in subviews) {
        [subview removeFromSuperview];
    }
    [subviews release];

このコードは一度に1行を表示していますが、それ以外の場合は誰も表示していません...

のコードcellForRowAtIndexPathはこれです...

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {   
    static NSString *identifier = @"Cell";
    UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSDictionary *dict = [appDelegate.webDataList objectAtIndex:indexPath.row];

    tableView.backgroundColor = [UIColor colorWithRed:0.39 green:0.39 blue:0.39 alpha:0.39];

    if([appDelegate.dataArray count]>0){

        imgView.backgroundColor = [UIColor clearColor];
        imgView =[[UIView alloc ] initWithFrame:CGRectMake(0,0,320,45)];
        imgView.tag= indexPath.row+250;
        [cell.contentView addSubview:imgView];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(291, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row+250;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(-25, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row+250;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(5, 7, 19, 21);
        button.tag = indexPath.row+250;
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"delete" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];    
        [imgView addSubview:button];

        NSArray *arr = [[appDelegate.dataArray objectAtIndex:indexPath.row] componentsSeparatedByString:@"/"];


        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
        label.text = [arr objectAtIndex:1];
        label.tag = indexPath.row+250;
        [label setFont:[UIFont fontWithName:@"Georgia" size:14]];
        [label setNumberOfLines:0];
        label.textAlignment = UITextAlignmentLeft;
        label.textColor = [UIColor whiteColor];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        label.backgroundColor = [UIColor clearColor];
        [imgView addSubview:label];
        [label release];

        NSDictionary *dict1 =[appDelegate.webDataList objectAtIndex:indexPath.row];


        label = [[UILabel alloc] initWithFrame:CGRectMake(181, 7, 75, 20)];
        label.tag = indexPath.row+250;
        label.text = [dict1 objectForKey:@"time"];
        [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
        label.textAlignment = UITextAlignmentLeft;
        [label setBackgroundColor:[UIColor clearColor]];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [label setTextColor:[UIColor whiteColor]];
        [imgView addSubview:label];
        [label release];
    }
    return cell;
}

私のコードでは、reuseTableViewCellWithIdentifier:各ラベルとボタンタグを同じにする必要があるため、メソッドを使用できません。他の場所でそれらをフェッチする必要があるためです。

4

1 に答える 1

3

それはあなたがそれを間違っているからです。テーブルをリロードする必要もありません。スクロールするだけで気付くでしょう。
セルが表示されるたびに、新しいラベルとボタンを作成します。もちろん、これらのUI要素が削除されることはありません。

新しいセルを作成するときにUI要素を追加し、それらにタグを付けます。セルが正常にデキューされた場合は、そのタグで要素を取得し、その値を設定します。

このような:

if (cell == nil) {
    // if no cell could be dequeued create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

    // add label to the new cell
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
    label.tag = 250;  // <---- save tag
    [label setFont:[UIFont fontWithName:@"Georgia" size:14]];
    [label setNumberOfLines:0];
    label.textAlignment = UITextAlignmentLeft;
    label.textColor = [UIColor whiteColor];
    label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    label.backgroundColor = [UIColor clearColor];
    //[imgView addSubview:label]; // I ignore this because I don't want to write 200 lines of code here. This is just an example so please adopt the code yourself
    [cell.contentView addSubView:label];
    [label release];
}

// whatever happened you have a cell with all the labels added here

UILabel *label = (UILabel *)[cell.contentView viewWithTag:250]      // <---- get label with tag
label.text = [arr objectAtIndex:1];

そして、あなたは必要ありませんif([appDelegate.dataArray count]>0)。他のすべてのテーブルビューデータソースメソッドが正しいtableView:cellForRowAtIndexPath:場合、データソースが空の場合は呼び出されません。


編集:ちょうどそれを見た:

私のコードでは、メソッドreuseTableViewCellWithIdentifierを使用できません。各ラベルとボタンタグを同じにする必要があるためです。他の場所でそれらをフェッチする必要があるためです。

実際にできます。誰もが使用でき、使用する必要がありますreuseTableViewCellWithIdentifier:
それに関するあなたの正確な問題は何ですか?
ボタンアクションメソッドでindexPath(またはこの場合は行のみ)を取得する必要がある場合は、別の質問に対する私の回答のコードを使用してください

于 2011-12-15T11:10:18.717 に答える