M e q u u e R u s a b l e CellWithIdentifierの実行メカニズム
UITableViewCell *cell = nil;
if([indexPath row] == 0)
{
static NSString *kDisplayCell_ID = @"DisplayCellID";
// ? ?n // 。
cell = [self.tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];
if(cell == nil)
{
// ? ?
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kDisplayCell_ID]autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
// ?
UIView *viewToRemove = nil;
viewToRemove = [cell.contentView viewWithTag:kViewKey];
if(viewToRemove)
[viewToRemove removeFromSuperview];
}
cell.textLabel.text = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kLabelKey ];
UIButton *button = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kViewKey];
[cell.contentView addSubview:button];
}
d e q u e R u s a b l CellWithIdentifierメッセージは、UItableViewCellオブジェクトを返します.つまり、UItableViewCellオブジェクトを取得するためのメッセージです.オブジェクトを初期化するとは言わないのは、nil値を返す可能性があるため、cellがnilの場合の処理手順を以下に追加します.この方法は、Identifierパラメータで命名されたUItableViewCellオブジェクトを1つのUItableViewCellオブジェクトプールから取得すると解釈できるかどうか.リソースが不足している場合、このプールは余分なUItableViewCellオブジェクトを自動的にクリーンアップします.オブジェクトを返すことはできませんが、リソースが豊富な場合は、作成せずに呼び出す必要があるときに迅速に戻るUItableViewCellオブジェクトが保存されます.dequeueReusableCellWithIdentifierは、文字通り「列の再利用可能なcell」と理解されていますが、実は簡単に言えばcellプールで、中にはあなたが前に作成したcellが入っています.使用時の注意点:1.再取得されたcellは、データがバンドルされているか、サブビューが追加されている可能性があるので、必要に応じて、textlabelのtextなどのデータとremoveを消去してaddのサブビューを削除します(tagを使用します).2.このような設計の目的は,頻繁なallocとdelloc cellオブジェクトを避けるためであり,それほど複雑ではない.3.設計の鍵はcellとデータの完全な分離キーを実現することであり、「1つの画面に表示されるcellの数」は限られているが、画面がスクロールすると、メソッドを呼び出して新しいcellを取得し、古いcellは画面の外にreuseメカニズムを表示しない.cellが表示する必要があるとき、queueの中から探して、見つけて、内容を設定して、表示するスクロールインタフェースcellが画面から移動されたとき、このcellをqueueの中に捨てて新しいcellを表示するとき、「同じタイプ」(identifier)のcellがあれば、キューから1つ取り出して、データを設定して、queueの中にどれだけのcellがあるかを表示して、これは自動的に制御して注意しなければならないのは、Queueにはcellのインスタンスが格納されており、「プロトタイプ」ではないため、上記のように「ページごとに5つあると仮定します.6番目は1番目のcellを多重化し、7番目は2番目を多重化します.」このような結果は、tableが何行あるかにかかわらず、メモリには実際に1つの画面ほど多くの行のcellを格納するだけで済みます. // the cell is being recycled, remove old embedded controls
// ?
UIView *viewToRemove = nil;
viewToRemove = [cell.contentView viewWithTag:kViewTag];
if (viewToRemove)
[viewToRemove removeFromSuperview];
/**このときCELLが多重化されると、このCELLに追加されたコントロール*/
UITableViewCell *cell = nil;
if([indexPath row] == 0)
{
static NSString *kDisplayCell_ID = @"DisplayCellID";
// ? ?n // 。
cell = [self.tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];
if(cell == nil)
{
// ? ?
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kDisplayCell_ID]autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
// ?
UIView *viewToRemove = nil;
viewToRemove = [cell.contentView viewWithTag:kViewKey];
if(viewToRemove)
[viewToRemove removeFromSuperview];
}
cell.textLabel.text = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kLabelKey ];
UIButton *button = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kViewKey];
[cell.contentView addSubview:button];
}
// the cell is being recycled, remove old embedded controls
// ?
UIView *viewToRemove = nil;
viewToRemove = [cell.contentView viewWithTag:kViewTag];
if (viewToRemove)
[viewToRemove removeFromSuperview];