0

これは、「cellForRowAtIndexPath」で使用しているコードです

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* cellIdentifier = @"OBBirthControlMethodsTableCell";
    OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    NSLog(@"cell id - %@",cell.subviews);
    CGRect frame = [tableView rectForRowAtIndexPath:0];
    if(nil == cell)
    {
        cell = [[[OBCustomDetailCell alloc]
                 initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

        if (indexPath.row != 3)
        {
            //Setting the basic template
            UIView *template = [[UIView alloc] init];
            template.tag = indexPath.row+10;
            NSLog(@"path index = %d",indexPath.row);
            UIImageView *templateImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,
                                                                                       200,
                                                                                       frame.size.height)];
            UILabel *templateLabel = [[UILabel alloc] initWithFrame:CGRectMake(templateImage.frame.size.width+20,
                                                                               0,
                                                                               cell.frame.size.width - templateImage.frame.size.width+20,
                                                                               frame.size.height)];
            [template addSubview:templateImage];
            [template addSubview:templateLabel];

            [cell.contentView addSubview:template];
        }
    }

    UIView *templateView = [cell.contentView viewWithTag:indexPath.row + 10];
    if (templateView)
    {
        NSLog(@"Gotten a templateView object");
        if (indexPath.row == 0)
        {
            templateView.frame = frame;

            for (UIView *view in templateView.subviews)
            {
                if ([view isKindOfClass:[UIImageView class]])
                {
                    [(UIImageView *)view setImage:[UIImage imageNamed:@"baby.jpeg"]];
                }
                else if  ([view isKindOfClass:[UILabel class]])
                {
                    [(UILabel *)view setText:@"This is not working"];
                }
            }
        }
        else
        {
            templateView.frame = CGRectMake(0, 50,
                                            frame.size.width,
                                            frame.size.height);

        }
    }
    return cell;
}

しかし、問題は、新しいセルが古いセルと同じ値を与えていることです。新しいセルは、下にスクロールするとデキューされます..

編集 最初のセルと同じ値を持つ新しいセルまでスクロールするとすぐに、重複したセルが作成されます..

  • select rows() ..if (indexPath.row != 3) のみに対して UIView を作成したいと思います
  • そして、いくつかの行で UIView の場所が異なるようにしたい.. if (indexPath.row == 0)
4

1 に答える 1

1

このコードにはいくつかの問題があります。何よりもまず、問題の主な原因は次のとおりです。

template.tag = indexPath.row+10;

なぜあなたはこれをやっている?のような定数値を使用して10ください。セルごとに変更されるため、インデックス パスを含める必要はありません。これによりviewWithTag:、再利用されたセルが失敗し、 が返されnilます。

indexPath.row != 3第 2 に、ある時点で非テンプレート セルが再利用される可能性があるため、テンプレート セルを だけに設定することはできません。テンプレート ビューがないため、次のレイアウトは失敗します。2 種類のセルに対して 2 つの再利用識別子を使用する必要があります。最終製品は次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *templateCellIdentifier = @"OBBirthControlMethodsTableCell";
    static NSString *otherCellIdentifier = @"OtherTableCell";

    if (indexPath.row != 3) {
        // Handle normal cells
        OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:templateCellIdentifier];
        if (cell == nil) {
            cell = [[[OBCustomDetailCell alloc] initWithStyle:UITableViewStyleDefault reuseIdentifier:templateCellIdentifier] autorelease];
            // Set up template cell
        }
        // Handle per-cell data
    } else {
        // Handle special cells
        OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:otherCellIdentifier];
        if (cell == nil) {
            cell = [[[OBCustomDetailCell alloc] initWithStyle:UITableViewStyleDefault reuseIdentifier:otherCellIdentifier] autorelease];
            // Set up other cell
        }
        // Handle per-cell data (not really necessary if there's only one of these)
    }
}
于 2012-07-16T06:35:11.580 に答える