0

UITableView セルはスクロール時に繰り返され、互いに重なり合っています。この問題を解決するにはどうすればよいですか

ここに私のコードがあります

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 11;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIButton *buyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImageView *img;
    UILabel *lbl;
    UIImageView *backImage;
    UILabel *textLabel;
    UILabel *detailTextLabel;

    NSInteger val = [indexPath row] * 3;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)];
        [buyBtn setFrame:CGRectMake(257, 35, 57, 24)];
        img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)];

        lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)];
        textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)];
        detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)];

        backImage.image = [UIImage imageNamed:@"shop-bg.png"];
        [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal];
        [img setImage:[UIImage imageNamed:@"price_button.png"]];
    }
    else
    {
        backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)];
        [buyBtn setFrame:CGRectMake(257, 35, 57, 24)];
        img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)];

        lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)];
        textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)];
        detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)];

        backImage.image = [UIImage imageNamed:@"shop-bg.png"];
        [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal];
        [img setImage:[UIImage imageNamed:@"price_button.png"]];
    }



    lbl.center = img.center;
    lbl.textAlignment =  UITextAlignmentCenter;
    lbl.text = [self.original_List objectAtIndex:val+2];
    lbl.backgroundColor = [UIColor clearColor];

    textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:14];
    textLabel.backgroundColor = [UIColor clearColor];
    textLabel.text = [self.original_List objectAtIndex:val];

    detailTextLabel.text = [self.original_List objectAtIndex:val+1];
    detailTextLabel.backgroundColor = [UIColor clearColor];
    detailTextLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:10];
    textLabel.textColor = [UIColor blackColor];
    detailTextLabel.textColor = [UIColor whiteColor];
    detailTextLabel.numberOfLines = 2;

    [buyBtn setTag:[indexPath row]];
    [buyBtn addTarget:self action:@selector(buyBtnPressed:) forControlEvents:UIControlEventTouchDown];



    static NSString *myIdentifier = @"myIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
    NSLog(@"%d" , [[cell subviews] count]);
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier];
    }
             cell.accessoryType = UITableViewCellAccessoryNone;
        [cell setSelectionStyle:UITableViewCellEditingStyleNone];
        cell.backgroundColor = [UIColor clearColor];

    [cell.contentView addSubview:backImage];
    [cell.contentView addSubview:detailTextLabel];
    [cell.contentView addSubview:textLabel];
    [cell.contentView addSubview:buyBtn];
    [cell.contentView addSubview:img];
    [cell.contentView addSubview:lbl];
    return cell;
}
4

4 に答える 4

1

このコードを試してください:-

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIButton *buyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImageView *img;
    UILabel *lbl;
    UIImageView *backImage;
    UILabel *textLabel;
    UILabel *detailTextLabel;

    NSInteger val = [indexPath row] * 3;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)];
        [buyBtn setFrame:CGRectMake(257, 35, 57, 24)];
        img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)];

        lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)];
        textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)];
        detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)];

        backImage.image = [UIImage imageNamed:@"shop-bg.png"];
        [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal];
        [img setImage:[UIImage imageNamed:@"price_button.png"]];
    }
    else
    {
        backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)];
        [buyBtn setFrame:CGRectMake(257, 35, 57, 24)];
        img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)];

        lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)];
        textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)];
        detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)];

        backImage.image = [UIImage imageNamed:@"shop-bg.png"];
        [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal];
        [img setImage:[UIImage imageNamed:@"price_button.png"]];
    }



    lbl.center = img.center;
    lbl.textAlignment =  UITextAlignmentCenter;
    lbl.text = [self.original_List objectAtIndex:val+2];
    lbl.backgroundColor = [UIColor clearColor];

    textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:14];
    textLabel.backgroundColor = [UIColor clearColor];
    textLabel.text = [self.original_List objectAtIndex:val];

    detailTextLabel.text = [self.original_List objectAtIndex:val+1];
    detailTextLabel.backgroundColor = [UIColor clearColor];
    detailTextLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:10];
    textLabel.textColor = [UIColor blackColor];
    detailTextLabel.textColor = [UIColor whiteColor];
    detailTextLabel.numberOfLines = 2;

    [buyBtn setTag:[indexPath row]];
    [buyBtn addTarget:self action:@selector(buyBtnPressed:) forControlEvents:UIControlEventTouchDown];



    static NSString *myIdentifier = @"myIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
    NSLog(@"%d" , [[cell subviews] count]);
    //if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier];
    }
             cell.accessoryType = UITableViewCellAccessoryNone;
        [cell setSelectionStyle:UITableViewCellEditingStyleNone];
        cell.backgroundColor = [UIColor clearColor];

    [cell.contentView addSubview:backImage];
    [cell.contentView addSubview:detailTextLabel];
    [cell.contentView addSubview:textLabel];
    [cell.contentView addSubview:buyBtn];
    [cell.contentView addSubview:img];
    [cell.contentView addSubview:lbl];
    return cell;
}
于 2013-01-03T11:56:39.680 に答える
0

ここで起こっていることはあなたが使うことです

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];

このコードは、UITableViewでスクロールしているときに、セルがメモリを節約するために再利用されることを確認します。すべてのセルに同じ識別子を使用しているため、「backImage」、「detailTextLabel」などがすでにあるセルを再利用し、既存のビューコンポーネントの上に新しいビューコンポーネントを追加します。

これは、次のようなコードを使用して修正できます。

static NSString *myIdentifier = @"myIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier];
    // Create backImage, detailTextLabel, etc. here
    ...

    // Give view components tags
    backImage.tag = 1;
    detailTextLabel.tag = 2;
    ...
}

UIImageView* retrievedBackImage = (UIImageView*)[cell.contentView viewWithTag:1];
UILabel* retrievedDetailTextLabel = (UILabel *)[cell.contentView viewWithTag:2];
...
// Initialise values
retrievedBackImage.image = [UIImage imageNamed:@"someImage.png"];
retrievedDetailTextLabel.text = @"something";
...

これがお役に立てば幸いです。

ニコラス

于 2013-01-03T12:40:19.483 に答える
0

セルの高さを確認する必要があります - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

コードで使用される最大の高さは 65 より大きくする必要があります

于 2013-01-03T11:58:37.987 に答える
0

reuseIdentifier を使用せず、nil に設定してください。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];


    }
于 2013-01-03T11:59:11.773 に答える