UITableViewCellindexPath
を指定すると、セルが現在存在するかどうかを知りたいです。
画面上にあるかどうかを確認する方法を知っています( を使用tableView.indexPathsForVisibleRows
)。ただし、画面から外れているが既に作成されているかどうかも知りたいです(ユーザーがスクロールしたが、まだ画面に入っていないと仮定します)。
どうすればいいですか?
UITableViewCellindexPath
を指定すると、セルが現在存在するかどうかを知りたいです。
画面上にあるかどうかを確認する方法を知っています( を使用tableView.indexPathsForVisibleRows
)。ただし、画面から外れているが既に作成されているかどうかも知りたいです(ユーザーがスクロールしたが、まだ画面に入っていないと仮定します)。
どうすればいいですか?
できるよ
[self.tableView cellForRowAtIndexPath:indexPath];
(データ ソース メソッドと混同しないでください[self tableView:cellForRowAtIndexPath:]
)、そのインデックス パスのセルが存在する場合は、それが返されます。それ以外の場合は、nil
.
あなたが言ったように、バックグラウンド更新プロセスがセルの直接参照を保持することは絶対に望ましくありません。これは、フェッチが完了するまでに画面からスクロールされてリサイクルされる可能性があるためです。代わりに、インデックス パスまたはインデックス パスの検索に使用できるデータの一部への参照を保持し、そのインデックス パスを上記のメソッドで使用してセルを取得します。
存在する唯一のセルは、現在表示されているセルです。セルがビューの外にスクロールするとすぐに、セル オブジェクトがUITableViewCelldequeueReusableCellWithIdentifier
メソッドで使用できるようになります。これは、このような少量の領域に表示される大量のテーブル データを処理するときに、OS がメモリを節約する方法です。
どのセルが既に表示されているかを追跡したい場合は、アプリの " cellForRowAtIndexPath:
" メソッドでオブジェクト データがテーブル ビュー セルに供給されるときに、基になるオブジェクトを変更して、ある種の BOOL または値を設定する必要があります。
でセルを再利用している場合dequeueReusableCellWithIdentifier:
、tableView はコンベアのように機能します。画面外にスクロールされたセルは、画面に入ろうとしているセルにすぐに転送されます。理論的には、tableView は画面以上のセルを作成しません。したがって、画面外のセルについて知りたいと思っても意味がありません。
UITableViewCell
MVC Patternに従った単なるビューです。特定の indexPath の特定のセルに何を表示するかを決定するのは、モデル、つまりデータです。あなたのコードはおそらく次のようになります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// dequeue a cell
// ...
if (!cell)
{
// init a cell
// ...
}
// for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties
cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath];
}
スウィフト3では
let YOURINDEXPATH = IndexPath(row: 4, section: 0)
if tableView.cellForRow(at: YOURINDEXPATH) != nil {
// DO YOUR STUFFS HERE
}
それに応じてインデックス パス (YOURINDEXPATH) を定義します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// dequeue a cell
// ...
if (cell == nill)
{
// init a cell
// ...
}
// for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties
cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath];
}
セルが存在するかどうかを確認できます....これが機能することを願っています... :)
あるいは、このようなことをすることができます
-(BOOL) isRowPresentInTableView:(int)row withSection:(int)section
{
if(section < [self.tableView numberOfSections])
{
if(row < [self.tableView numberOfRowsInSection:section])
{
return YES;
}
}
return NO;
}