読みましたAppleドキュメンテーションであり、Objective-C
の初心者にとっては私としては理解できません。これに続いて複数列UITableView
を実装しようとしています link 例、それがうまくいかないので、cellForRowAtIndexPath
がどのように機能するかを理解する必要がありますが、個人的にはこの方法はかなり複雑に思えます。
1)それは何を返しますか? UITableViewCell
?しかし、なぜそんなに奇妙に見えるのでしょうか?
-(UITableViewCell *)tableView:(UITableView *)tableView
2)どのように呼び出されますか?特定のUITableView
???に接続する方法は何ですか? UITableView
とfirstTableView
という名前の2つのsecondTableView
があり、それらを異なるものにしたい場合(cellForRowAtIndexPath
を異なる方法で実行するには)? UITableViews
をこれにリンクする方法
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
メソッドはNSIndexPath
ではなくUITableView
を受け入れます。どうする?
1)関数は、テーブルビューのセルを返しますyes?したがって、返されるオブジェクトのタイプはUITableViewCell
です。これらは、テーブルの行に表示されるオブジェクトです。この関数は基本的に、テーブルビューのセルを返します。ただし、関数はどのセルをどの行に返すかをどのように知るかを尋ねるかもしれません。これは2番目の質問で回答されます
2)NSIndexPath
は、本質的に2つのことです。
テーブルは多くのセクションに分割され、それぞれが独自の行を持つため、このNSIndexPath
を使用すると、どのセクションとどの行を正確に識別することができます。どちらも整数です。あなたが初心者なら、たった1つのセクションで試してみてください。
View ControllerにUITableViewDataSource
プロトコルを実装すると呼び出されます。より簡単な方法は、UITableViewController
クラスを追加することです。 Appleには、テーブルを記述できる関数を簡単に実装するためのコードが記述されています。とにかく、このプロトコルを自分で実装する場合は、UITableViewCell
を作成する必要がありますテーブルビューに表示されるセルは何度も再利用されるため、再参照可能性を理解するためにクラス参照を参照してください(これは非常に効率的な設計です)。
2つのテーブルビューがある場合については、メソッドを見てください。テーブルビューが渡されるため、それに関して問題はないはずです。
私はそれを分解してみます( ドキュメント の例)
/*
* 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
メソッドであるため、DataSource
のUITableView
として自身を宣言したオブジェクトで呼び出されます。これは、行とセクションの数(他のDataSourceメソッドで指定)に基づいて、テーブルビューが実際にセルを画面に表示する必要があるときに呼び出されます。
基本的には、セルを設計しています。セルごとに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
}