3

私のUITableViewCellsはデータの入力を受け入れることができます。あるセルで作業しているときに、ユーザーが上にスクロールして別のセルで何かをチェックしてから、最初のセルに戻ってデータ入力を続行するのは完全に自然なことです。

問題は、これによりUITableViewがセルをリサイクルすることが頻繁に発生し、プログラムに大混乱をもたらすことです。

セルをリサイクルしないようにiOSに一時的に指示する方法はありますか?

データ入力が終わったら、リサイクルしても大丈夫です。

データエントリがカスタムキーボードを使用していることを追加する必要があります。したがって、ファーストレスポンダーのステータスは問題ではありません。

4

4 に答える 4

4

大幅に異なるセルに異なるcellIdentifierを指定します。下部のセルに独自の識別子がある場合、ユーザーが下部にスクロールしても、セルは上部からリサイクルされません。ただし、これにより、セルは再利用キューの一番上に保持されるため、一番上にスクロールして戻るときに、セルを再作成する必要はありません。

于 2011-03-21T19:20:20.620 に答える
3

dequeueReusableCellWithIdentifier:一般的な方法での方法を使用する場合、セルのリサイクルを防ぐ方法はありませんUITableView

これを実行したい場合は、UITableViewのデータソースプロトコルメソッドで独自に実装する必要があります- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

于 2011-03-21T18:23:04.823 に答える
2

主にイジーが言ったように、それは一般的な働き方ではありません。また、リストの動作に反すると、問題が発生する可能性があります。問題を減らしたい場合は、セルのコンテンツをメモリに保持し、この保存されたコンテンツを使用して、willDisplayCellが呼び出されたときに、毎回最初からすべてを再構築するのではなく、セルを補充します。

于 2011-03-21T19:16:27.047 に答える
0

Gendolkariのソリューションは、デキューサイクルからセルを一時的に削除するためのアイデアを私に与えました。KVCを使用して読み取り専用の値を設定する必要があるため、真にハックする必要はありません。

サイクルからセルを最初に削除する場合は、その特定のセルのreuseIdentifierを変更します。後でセルを見つけられるようにしたいので、インデックスを作成できる名前に変更します。ここで[NSIndexPathの説明]が役立つことがわかりました。restartIdentifierは読み取り専用のプロパティですが、これはObjective-Cであり、KVCがあります。

[cell setValue:[[self.tableView indexPathForCell:cell] description] forKey:@"reuseIdentifier"];

これで、cellForRowAtIndexPathのセルを再利用するたびに次のようになります。

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

restartIdentifierを変更したため、この特定のセルは返されません。

ただし、下にスクロールしてから上にスクロールすると、デキューサイクルから削除した元のセルを表示したい場合があります。セルを再利用するときにこれを行うには、最初にindexPathに基づいてセルをデキューしようとしますが、それが見つからない場合は、基本的なセルID文字列に基づいてセルをデキューしようとします。

UITableViewCell *cell;
cell = [self.tableView dequeueReusableCellWithIdentifier:[indexPath description]];
if (!cell) cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

そのセルをデキューサイクルに戻したい場合は、reuseIdentifierを元の値に戻すだけです。

[cell setValue:@"cellIdentifier" forKey:@"reuseIdentifier"];
于 2015-01-14T19:34:03.047 に答える