15

ストーリーボードに 3 つの異なるセルを作成し、すべてのアウトレットを接続しました。各セルには一意の識別子があります。

たとえば、写真を保持するセル、ラベルを含むセル、および他のコンテンツを含むセルがあるため、それらはすべて一意であり、各セルタイプには独自の高さが必要です (動的またはステータス、それは問題ではありません)。

しかし、「indentifier1」を含むセルが特定の高さを返し、他のセルが異なる高さを返すようにするにはどうすればよいですか?

使用できることはわかっています- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPathが、細胞を区別する方法がわかりません。

私はコアデータを使用しており、そこからテーブルビューの結果を取得しています。

編集

タグでこれを試しましたが、最初のifステートメントでクラッシュします:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat cellHeight;

    if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 1) cellHeight = 170;
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 2) cellHeight = 100;
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 3) cellHeight = 140;

    return cellHeight;
}
4

5 に答える 5

17

更新しました

UITableViewが自動的に計算するので簡単なので、UITableViewの動的な高さを使用してください

以下の要件にこの方法を使用する例は次のとおりです。

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

  //calculate height according to text and on basis of indexPath
  if(indexpath.row == 0)
  {
    return 60.0f;
  }
  else if(indexpath.row == 1)
  {
    return 70.0f;
  }
  else
  {
    return 55.0f;
  }
}

:サイズが固定されていない場合は、サイズを計算してから、要件に応じて上記の方法で指定します。

于 2012-06-28T20:55:56.853 に答える
1

cellForRowAtIndexPath内部で呼び出さないでください。そうしないとheightForRowAtIndexPath、アプリがクラッシュする原因となる無限ループに入ります。

で同じセルのタイプを決定するのと同じ方法で、すべてのセルの高さを決定する必要がありますcellForRowAtIndexPath

それが私が考える唯一の解決策です。

于 2012-06-28T21:30:01.593 に答える
0

もちろん、デリゲートメソッドにいるため(あなたはのデリゲートですUITableView)、メソッドをコールバックするUITableViewメソッドはクラッシュのリスクが非常に高いため、クラッシュしました。

メソッド ( [tableView cellForRowAtIndexPath:indexPath]) を呼び出すと、セルの高さのデリゲート メソッドが再度呼び出され、無限ループ、つまりクラッシュが発生します。

これは正常な動作です。

キーは元のデータ ソースにあり、各行の高さを元のデータ ソースに格納でき、リスクなしでデリゲート メソッドでそこからすべてを読み取ることができます。

あなたのコードフラグメントは、データソースがどこにあり、どのような種類のデータソースであるかを示していないため、それがないとより正確な解決策を提供できませんが、アイデアはそれです.

于 2012-06-28T21:38:32.327 に答える
0

各 UITableView セルのタグを設定して、heightForRowAtIndexPath で次のように区別できるようにします。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if ([self.tableview cellForRowAtIndexPath:indexPath].tag == yourTag){
     //perform your action for cell 1, 2, or 3
  }
else if (etc...)
}
于 2012-06-28T20:55:52.217 に答える
0

で行うように、それらを正確に区別しますcellForRowAtIndexPath:。セクションごとにグループ化していない場合は、問題の特定の indexPath についてデータをポーリングし、その後高さを決定する必要があります。

于 2012-06-28T20:54:25.787 に答える