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


    static NSString *CellIdentifier = @"NotificationViewCell";
    CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil){

        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];


        cell.contentView.backgroundColor=[UIColor clearColor];
        [ModelClass addSublayer:cell.contentView];


        cell.cellbg.layer.cornerRadius = 8;
        cell.cellbg.layer.masksToBounds = YES;

         cell.cellbg.layer.borderWidth = 1;
         cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor];


        cell.logoImage.layer.cornerRadius = 8;
        cell.logoImage.layer.masksToBounds = YES;

        cell.logoImage.layer.borderWidth = 1;
        cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor];



        Merchant *merchantList= [self.cardListArr objectAtIndex:indexPath.row];

        cell.nameLab.text=merchantList.name;

        NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points);
    //    NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO);
        cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]];


        cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO];



        if(![ModelClass isBlankString:merchantList.introPic])
        {
              NSLog(@"merchantList.introPic=%@",merchantList.introPic);

            [cell.logoImage setImageUrl:merchantList.introPic];


        }
    }

    return cell;

}
  1. 上記のコードを使用して UITableViewCell を再利用したいのですが、正しいかどうかわかりません。アドバイスが欲しいです。
  2. 私が使用している私のコードを見ることができます if(cell==nil),私はどのコードを書くべきか知りたいです}))

  3. すべてのセルのビューが同じで、高さが異なる場合、たとえば imageview が 20 または 40 などの場合、状況にどう対処するか。

4

3 に答える 3

6

1.セルが再利用され、作成されたときにセルに入らないため、正しくありませんif-statement。したがって、if-statementセルを初期化するだけで、setTextとsetImageを外側にコーディングする必要がありますif-statement。_

そのような :

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


    static NSString *CellIdentifier = @"NotificationViewCell";
    CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil){

        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];


        cell.contentView.backgroundColor=[UIColor clearColor];
        [ModelClass addSublayer:cell.contentView];


        cell.cellbg.layer.cornerRadius = 8;
        cell.cellbg.layer.masksToBounds = YES;

         cell.cellbg.layer.borderWidth = 1;
         cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor];


        cell.logoImage.layer.cornerRadius = 8;
        cell.logoImage.layer.masksToBounds = YES;

        cell.logoImage.layer.borderWidth = 1;
        cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor];

        }

        Merchant *merchantList= [self.cardListArr objectAtIndex:indexPath.row];

        cell.nameLab.text=merchantList.name;

        NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points);
    //    NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO);
        cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]];


        cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO];



        if(![ModelClass isBlankString:merchantList.introPic])
        {
              NSLog(@"merchantList.introPic=%@",merchantList.introPic);

            [cell.logoImage setImageUrl:merchantList.introPic];


        }


        return cell;

    }

2 ほとんどの人は次のようにコーディングします:

if(cell==nil)
{
    //init code
}

// setting code

3.セルの高さを設定したい場合は、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

dataSource のメソッドでコーディングする必要があります。- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

このようなコード:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (index.row % 2)
        return 20.0f;
    return 40.0f;
}
于 2013-02-27T07:59:53.893 に答える
1

私は通常、セルの作成と構成を2つの論理的な部分に分けます。

  1. セルを作成し、すべての単一セルで同じであるすべてのプロパティを設定します(つまり、レイアウト、レイヤー)
  2. -(void)configureCell:(UITableViewCell*)cell;データソースから特定のセルに固有のすべてを設定する別の関数を記述します(つまり、labelsとimageViewの値)。

次にcellForRowAtIndexPath

-(UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"NotificationViewCell";
    CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil){
       [self createCell:&cell];
    }

    Mercant* mercantList = [self.cardListArr objectAtIndex:indexPath.row];

    [self configureCell:cell withMercant:mercantList];

    return cell;
}

-(void)createCell:(CardViewCell**)cellPtr
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell" 
                                                 owner:self 
                                               options:nil];
    *cellPtr = [nib objectAtIndex:0];

    CardViewCell* cell = *cellPtr;

    cell.contentView.backgroundColor=[UIColor clearColor];
    [ModelClass addSublayer:cell.contentView];

    cell.cellbg.layer.cornerRadius = 8;
    cell.cellbg.layer.masksToBounds = YES;

    cell.cellbg.layer.borderWidth = 1;
    cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor];


    cell.logoImage.layer.cornerRadius = 8;
    cell.logoImage.layer.masksToBounds = YES;

    cell.logoImage.layer.borderWidth = 1;
    cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor];
}

-(void)configureCell:(CardViewCell*)cell withMercant:(Mercant*)mercantList
{
    cell.nameLab.text=merchantList.name;

    NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points);
//    NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO);
    cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]];


    cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO];



    if(![ModelClass isBlankString:merchantList.introPic])
    {
          NSLog(@"merchantList.introPic=%@",merchantList.introPic);

        [cell.logoImage setImageUrl:merchantList.introPic];


    }
}
于 2013-02-27T08:02:38.147 に答える