2011-11-04 15 views
2

サブタイトルやコンテナオブジェクトを使用せずに、DequeueReusableCell(string identifier)を介してリサイクル(デキュー解除)された後でも、UITableViewCellのインスタンスを一意に識別する方法を探しています。UITableViewCell固有の識別子ですか?

基本的には、新しいセルを作成するときに、このセルの一意のIDを別の関連オブジェクトを辞書に格納するキーとして使用したいと考えています。後で、セルのリサイクル/デキューのときに、関連するオブジェクトを辞書から読みたいと思います。 リサイクルされたセルは、テーブル内の任意のインデックスパスに置かれ、他のオブジェクトは実際にはインデックスインスタンスではなくセルインスタンスに関連している可能性があります。

オブジェクトとの関連性を失うことは避けてください。得られたIDは、セルが作成されたときに使用されたIDと同じでなければなりません。

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

私はClassHandleHandleおよびSuperHandleのプロパティを見てきました。デキューの間で一貫性を保つ唯一のものは、ClassHandleのようです。

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

+0

UITableViewCellをサブクラス化したくないという特別な理由がありますか?そうすることで、アプリケーションをもっと複雑にする可能性は非常に高くなります。なぜなら、セルに直接必要とするタイプの参照を格納し、それを気にする必要がないからです。非常に単純な継承クラスを作成しました。これは非常に柔軟性があり、これまでに直面していたすべてのシナリオで機能していたObjectタグを持っています。 –

+0

AndroidおよびiOSバージョンのアプリでは、現在、辞書を使用して各セルの追加オブジェクトを保存しています(必要な場合)。私は単に一貫性を保っていきたいと思います。 – riha

答えて

2

あなたがあなた自身の単調に増加する番号を作成することができます

static int monotonicNumber; 

をし、その後にタグを設定します。

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

Environment.TickCountが一意であることが保証されていない、あなたが得ることができることを注意をあなたがそれを素早く連続して取り出すならば、同じ目盛りがカウントされます。それが私に起こったので私は知っている。

+0

1)静的な理由説明してください。 2)単純に++にするのは大丈夫でしょうか? AFAIKでは、UIスレッドのみがUIコードを実行します。 – riha

+0

1)どうしてですか?それは本当にあなたのコードに依存しますが、クラスの複数のインスタンスにわたって一意のIDを必要としない場合は、インスタンスフィールドも使用できます。私はあなたがそれを必要とするかどうかわからなかったので、私は安全なオプションを選んだ:静的。 2)はい、UIスレッドでのみ使用される場合は、インクリメント演算子++を使用できます。 –

+0

説明をいただきありがとうございます – riha

1

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

これらは常に、.NET用のIDSユニークであることが証明され、標準的な、です。これらは、WindowsとMonoをどこでも実行できます。

私はTagプロパティがオブジェクトであると仮定しており、そこに格納することができます(しかし、Appleを知っているintかもしれません)。そうでなければ、UITableViewCellをサブクラス化してGuid型のプロパティを追加できます。ジョナサン・ペッパーの答えに加えて

+0

タグはintです(残念ながら) – riha

+0

UITableViewCellをサブクラス化する必要があります。彼らはまだDequeueReuseableCellで適切に出てくるでしょう、あなたはあなたの新しいタイプにキャストすることができます。 – jonathanpeppers

2

、これはオンラインの多くの例で使用される、かなり一般的な技術である:

あなたGetCell方法で新しいセルを作成するたびに、

cell.Tag = Environment.TickCount; 

を用いて細胞のTagを設定これは、カスタムセルオブジェクトを持っている場合に特に便利です。あなたの細胞は、その後、例えば、辞書を使用してデータソースクラスで追跡することができます。

Dictionary<int, your_cell_type> cells = ... 

あなたが特定の何か細胞を追跡する必要がある場合、あなたは辞書オブジェクトの上にそれをルックアップするためにTagを使用することができます。

+0

有望に見える、私はそれを試み、報告を返す。 – riha

+0

ここに元の記事があります。私はこのアイデアをhttp://www.infoq.com/articles/monotouch-custom-tables – Ryan

+0

から入手しました。この方法をとる場合は、ディクショナリオブジェクトを使用して、辞書に蓄積された一連のセルでメモリリークが発生しないようにします。 –

関連する問題