web-dev-qa-db-ja.com

cellForRowAtIndexPathはどのように機能しますか?

読みましたAppleドキュメンテーションであり、Objective-Cの初心者にとっては私としては理解できません。これに続いて複数列UITableViewを実装しようとしています link 例、それがうまくいかないので、cellForRowAtIndexPathがどのように機能するかを理解する必要がありますが、個人的にはこの方法はかなり複雑に思えます。

1)それは何を返しますか? UITableViewCell?しかし、なぜそんなに奇妙に見えるのでしょうか?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • それは何ですか?説明してもらえますか?

2)どのように呼び出されますか?特定のUITableView ???に接続する方法は何ですか? UITableViewfirstTableViewという名前の2つのsecondTableViewがあり、それらを異なるものにしたい場合(cellForRowAtIndexPathを異なる方法で実行するには)? UITableViewsをこれにリンクする方法

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

メソッドはNSIndexPathではなくUITableViewを受け入れます。どうする?

53

1)関数は、テーブルビューのセルを返しますyes?したがって、返されるオブジェクトのタイプはUITableViewCellです。これらは、テーブルの行に表示されるオブジェクトです。この関数は基本的に、テーブルビューのセルを返します。ただし、関数はどのセルをどの行に返すかをどのように知るかを尋ねるかもしれません。これは2番目の質問で回答されます

2)NSIndexPathは、本質的に2つのことです。

  • あなたのセクション
  • あなたの行

テーブルは多くのセクションに分割され、それぞれが独自の行を持つため、このNSIndexPathを使用すると、どのセクションとどの行を正確に識別することができます。どちらも整数です。あなたが初心者なら、たった1つのセクションで試してみてください。

View ControllerにUITableViewDataSourceプロトコルを実装すると呼び出されます。より簡単な方法は、UITableViewControllerクラスを追加することです。 Appleには、テーブルを記述できる関数を簡単に実装するためのコードが記述されています。とにかく、このプロトコルを自分で実装する場合は、UITableViewCellを作成する必要がありますテーブルビューに表示されるセルは何度も再利用されるため、再参照可能性を理解するためにクラス参照を参照してください(これは非常に効率的な設計です)。

2つのテーブルビューがある場合については、メソッドを見てください。テーブルビューが渡されるため、それに関して問題はないはずです。

37
MadhavanRP

私はそれを分解してみます( ドキュメント の例)

/* 
 *   The cellForRowAtIndexPath takes for argument the tableView (so if the same object
 *   is delegate for several tableViews it can identify which one is asking for a cell),
 *   and an indexPath which determines which row and section the cell is returned for. 
 */ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    /*
     *   This is an important bit, it asks the table view if it has any available cells
     *   already created which it is not using (if they are offScreen), so that it can
     *   reuse them (saving the time of alloc/init/load from xib a new cell ).
     *   The identifier is there to differentiate between different types of cells
     *   (you can display different types of cells in the same table view)
     */

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    /*
     *   If the cell is nil it means no cell was available for reuse and that we should
     *   create a new one.
     */
    if (cell == nil) {

        /* 
         *   Actually create a new cell (with an identifier so that it can be dequeued). 
         */

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }

    /*
     *   Now that we have a cell we can configure it to display the data corresponding to
     *   this row/section
     */

    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row];
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"];
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"];
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = theImage;

    /* Now that the cell is configured we return it to the table view so that it can display it */

    return cell;

}

これはDataSourceメソッドであるため、DataSourceUITableViewとして自身を宣言したオブジェクトで呼び出されます。これは、行とセクションの数(他のDataSourceメソッドで指定)に基づいて、テーブルビューが実際にセルを画面に表示する必要があるときに呼び出されます。

96
jbat100

基本的には、セルを設計しています。セルごとにcellforrowatindexpathが呼び出され、セル番号はindexpath.rowによって、セクション番号はindexpath.sectionによって検出されます。ここでは、テーブル内のすべての行に対して更新されるラベル、ボタン、またはテキスト化された画像を使用できます。 2番目の質問に対する回答インデックスパスの行のセルでは、ifステートメントを使用します

Objective Cの場合

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

 NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if(tableView == firstTableView)
  {
      //code for first table view 
      [cell.contentView addSubview: someView];
  }

  if(tableview == secondTableView)
  {
      //code for secondTableView 
      [cell.contentView addSubview: someView];
  }
  return cell;
}

In Swift 3.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{
  let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

  if(tableView == firstTableView)   {
     //code for first table view 
  }

  if(tableview == secondTableView)      {
     //code for secondTableView 
  }

  return cell
}
6
Koushik