8

これは最もよく聞かれる質問の1つですが、包括的な答えは1つ見つかりませんでした。UITableViewにカスタムセルが必要です。ラベルやテキストフィールドを含むものと、画像やボタンを含むものがあります。セルの種類ごとに別々のクラスを作成しました。複数のセクションを持つGroupStyleテーブルを使用しています。現在、cellForIndexPathにセルを追加しており、セクションの場合はswitch-case、セクションの行の場合はif-elseを使用しています。

id cell;
switch(indexPath.section) {
    case 0:
           if(indexPath.row==0) {
               CellA *cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           else if(indexPath.row==1) {
               CellB *cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    case 1:
           if(indexPath.row==0) {
               CellC *cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    default:
            break;
}
return cell;

コードブロック内のセルの定義により、セルが認識できなくなるため、最後にセルを返す必要があります。それを解決するために、idを上にしてセルを宣言しましたが、これは正しい方法ではないことを私は知っています。複数のタイプのセルのこの宣言とアクセスの問題を解決するにはどうすればよいですか?

現在、1つの画面に収まり、スクロールする必要のない4〜5行があります。だから、私は細胞を再利用していません。ただし、編集中にさらに多くの行が押し込まれます。また、別のテーブルには、画面をスクロールできる行がさらにあります。これは、セルを再利用する必要があることを意味します。ですから、私の質問の2番目の部分は次のとおりです。複数のカスタムセルを再利用するにはどうすればよいですか?

4

2 に答える 2

11

あなたの最初の質問に答えるために、あなたはあなたが返すnilのに良い価値がないのであなたは戻ったほうがよいでしょう。このケースに遭遇した場合、例外がスローされます。現在のように、フレームワークコード内のどこかにEXC_BAD_ACCESSが与えられる可能性があります。

2番目の質問に答えるには、各タイプのセルに一意のreuseIdentifierが必要です。たとえば、すべてのCellAは@"CellA"のreuseIdentifierを持つことができます。次に、すべてのセルが同じである場合とまったく同じようにそれらを再利用します。CellA呼び出しが必要な場合、CellB呼び出し[tableView dequeueReusableCellWithIdentifier:@"CellA"]が必要な場合[tableView dequeueReusableCellWithIdentifier:@"CellB"]などです。例えば、

    case 0:
        if (indexPath.row == 0) {
            CellA *cell = [tableView dequeueReusableCellWithIdentifier:@"CellA"];
            if (!cell) {
                cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellA"] autorelease];
            }
            // configure cell
            return cell;
        }
        else if (indexPath.row == 1) {
            CellB *cell = [tableView dequeueReusableCellWithIdentifier:@"CellB"];
            if (!cell) {
                cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellB"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
    case 1:
        if (indexPath.row == 0) {
            CellC *cell = [tableView dequeueReusableCellWithIdentifier:@"CellC"];
            if (!cell) {
                cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellC"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
于 2011-04-07T02:11:16.377 に答える
0

UITableViewをUIViewに追加します。カスタムセルを追加し、カスタムセルクラスを関連付け、デリゲート-UITableviewDelegateおよびUITableViewDataSourceを実装します。

ケース1:テーブルビューの2つのカスタムセル

func tableView(tableView:UITableView、cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell {

  var cell: CustomCell!

  if indexPath.row == 0{
    cell = tableView.dequeueReusableCellWithIdentifier("Cell1ID", forIndexPath: indexPath) as CustomCell
    //set cell2
  }
  if indexPath.row >= 1{
    cell = tableView.dequeueReusableCellWithIdentifier("Cell2ID", forIndexPath: indexPath) as CustomCell
    let cons = aArray[indexPath.row - 1]
    // set cell2 
  }
  return cell
}

ケース2:カスタムセルの代替表示(つまり、uisegmentcontrolを使用)

var CellIdentifier: String = "Cell1ID"

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
       if (CellIdentifier == "Cell1ID")
    {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! FirstTableViewCell

//additional code
return cell

}
else {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! SecondTableViewReportsCell

//Additional code

return cell
}
}

ケース3:代替カスタムセル(つまり、奇数偶数)

var CellIdentifier: String = "Cell1ID"

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

var cell: CustomCell!

if (indexPath.row % 2 == 0) {

let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! FirstTableViewCell
   
}
else
{
        let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! SecondTableViewCell
}
return cell
}
于 2016-02-11T07:10:55.773 に答える