2

UITableViewCells のインスタンスがDequeueReusableCell(string identifier)を介してリサイクル (デキュー) された後でも、サブクラス化やコンテナー オブジェクトの使用なしで一意に識別する方法を探しています。

基本的に、新しいセルを作成するときは、このセルの一意の ID をキーとして使用して、別の関連オブジェクトをディクショナリに格納します。後で、セルがリサイクル/デキューされたときに、関連するオブジェクトを辞書から読みたいと思います。リサイクルされたセルがテーブル内の任意のインデックス パスに配置される可能性があり、(ほとんどの場合) 以前よりも他のデータが含まれている可能性があることを完全に認識しています。他のオブジェクトは実際にはインデックス パスではなく、セル インスタンスに関連しています。

オブジェクトとの関係を失うことは避けなければなりません。取得された ID は、セルが作成されたときに使用されたものと必ず同じでなければなりません。

これは、以前は乱数を生成し、それをセルのタグとして保存することで実現されていました。ただし、これらのタグは衝突する可能性があり (同じ乱数が 2 回生成された場合)、衝突回避は最後の手段としてのみ実装したいと考えています。だから私はより良い方法を探しています。

ClassHandleHandle、およびSuperHandleプロパティを見てきました。デキュー間で一貫性を保っているのは ClassHandle だけのようです。

この目的で ClassHandle プロパティを使用しても安全ですか? そうでない場合、他にどのようなオプションがありますか?

4

3 に答える 3

2

単調に増加する独自の数を作成できます。

static int monotonicNumber;

次に、タグを次のように設定します。

cell.Tag = System.Threading.Interlocked.Increment (ref monotonicNumber);

Environment.TickCount が一意であるとは限らないことに注意してください。すばやく連続してフェッチすると、同じティック数を取得できます。それは私に起こったので、私は知っています。

于 2011-11-04T22:25:51.310 に答える
2

Jonathan Pepper の回答に加えて、これはオンラインの多数の例で使用されているかなり一般的な手法です。

メソッドで新しいセルを作成するときはいつでもGetCell、セルのTagusing を設定します

cell.Tag = Environment.TickCount;

これは、カスタム セル オブジェクトがある場合に特に便利です。次に、ディクショナリを使用してデータ ソース クラスでセルを追跡できます。次に例を示します。

Dictionary<int, your_cell_type> cells = ...

セル固有のものを追跡する必要がある場合は、 を使用Tagしてディクショナリ オブジェクトで検索できます。

于 2011-11-04T13:58:32.807 に答える
1

Guid を使用することもできます: http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

これらは標準であり、常に一意であることが証明されている .Net の ID です。これらは、Windows だけでなく、どこでも実行される Mono で利用できます。

Tag プロパティはオブジェクトであり、そこに格納できると想定しています (ただし、Apple を知っている int である可能性があります)。そうでない場合は、UITableViewCell をサブクラス化して Guid 型のプロパティを追加できます。

于 2011-11-04T12:24:46.073 に答える