1

こんにちは、ストーリーボードで 4 つのプロトタイプ セルを使用してみます。プロトタイプセルごとに、ラベルが付いたクラス uitableviewCell があります。

私のコードを見てください:

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


    static NSString *CellIdentifier  = @"ProfilCell";
    static NSString *CellIdentifier1 = @"ProfilCell1";
    static NSString *CellIdentifier2 = @"ProfilCell2";
    static NSString *CellIdentifier3 = @"ProfilCell3";
    static NSString *CellIdentifier4 = @"ProfilCell4";

    if(indexPath.section == 0) 
    {
        ProfilCell* cell =(ProfilCell*)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        cell.pseudoLabel.text=[[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];

        return cell;

    }

      if(indexPath.section == 1) 
      {
        ProfilCell2* cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

       cell.textLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];

        return cell;

    }

   if(indexPath.section == 2) 
    {
        switch (indexPath.row) 
        {
            case 0:
            {

                 ProfilCell3* cell =(ProfilCell3*)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
                 cell.ageLabel.text=  [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
              return cell;
            }
                break;

            case 1:

            {

                ProfilCell4* cell = (ProfilCell4*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
                cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];

                return cell;

            }
                break;
            case 2:
            {
                ProfilCell5* cell = (ProfilCell5*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier4];


                cell.membreLab.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"membre"];

                return cell;

            }
                break;   
            default:
                break;
        }
    }
          return nil;
}

セクション 0 セクション 1 では、ラベルにデータがありますが、セクション 2 ケース 0 では次のようになります。

[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

配列が空に見える理由

配列にオブジェクトが 1 つしかないので、indexPath に 0 を指定するだけで問題ありません!!!

4

4 に答える 4

1

あなたはおそらくこのようなものを試してみるべきです...

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

    static NSString *CellIdentifier = @"ProfilCell";
    static NSString *CellIdentifier1 = @"ProfilCell1";
    static NSString *CellIdentifier2 = @"ProfilCell2";
    static NSString *CellIdentifier3 = @"ProfilCell3";

    id cell = nil;

    if(indexPath.section == 0) {
              cell = (ProfilCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
              cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
    }

    if(indexPath.section == 1) {
            cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            cell.statusLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];
    }

    if(indexPath.section == 2) {
            cell =(ProfilCell3*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
            cell.ageLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
    }

    if(indexPath.section == 3) {
            cell = (ProfilCell4*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
            cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];
    }


    return cell;

    }

ここで行ったことは、 type の cell に var を設定するidことです。つまり、何でもかまいません。if ステートメントで、セルを決定し、それに応じて設定します。各ステートメントではなく、最後にセルのインスタンスを1つだけ返します。お役に立てれば

于 2012-06-06T03:11:52.673 に答える
1

dequeueReusable... への各呼び出しが実際にセルを返していることを確認する必要があります。使用する:

NSAssert (cell, @"Missed Cell");

各「if」ステートメントの本文に。私の疑いは、nil セルが返されているということです。これは、「ProfilCell」、「ProfilCell1」などの再利用識別子がストーリーボードのセル識別子と一致しないためです。これを修正するには、ストーリーボードに移動し、各プロトタイプ セルを 1 つずつ選択し、「識別子」がコードの内容と一致することを確認します。そうでない場合は、同意するように変更してください。

「識別子」は一致する必要があります。「ラベル」ではありません!

于 2012-06-06T03:41:16.880 に答える
0

ProfilCell、ProfilCell2、ProfilCell3、および ProfilCell4 がすべて UITableViewCell のサブクラスであることを確認します

また、セル識別子がストーリーボードのものと一致することを確認してください。

于 2012-06-06T03:53:20.167 に答える
-2

を呼び出した後、 の戻り値を確認するdequeueReusableCellWithIdentifier:必要がありnilます。戻り値が でない場合はnil問題ありません。キューから再利用可能なセルを取得しました。 しかし、戻り値が の場合はnil、キューに再利用可能なセルがありませんでした。(これは常に、新しく作成されたテーブルの場合です。) この後者の場合、プログラムで and を使用して、新しいセルを作成する必要がありallocますinit

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:@"TableViewCell"] autorelease];

または .xib ファイルからロードします。

cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell"
                                      owner:self options:nil] lastObject];

あなたの場合、次のようなことを試してみてください (他のセクションについても繰り返します)。

if (indexPath.section == 0)
{
    ProfilCell *cell = (ProfilCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)  // if we did not get a reusable cell from the queue, we make one…
    {
        cell = [[ProfilCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
    return cell;
}
于 2012-06-06T03:27:39.280 に答える