0

スクロールを開始する前に、テーブルに複数回表示されるように見えるカスタム UITableViewCell があります。dequeueReusableCellWithIdentifier が正しく機能していないようです。ここに私の細胞があります:

MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    ... setup ...
}

tableView で reloadRowsAtIndexPaths: を呼び出すと、何らかの理由でそのセルがデキューされず、新しいセルが再作成されます。次に、上にスクロールしてから下にスクロールすると、最初のセルがデキューされることもあれば、2 番目のセルがデキューされることもあります。MyCustomCell は基本的にテキストフィールドであるため、デキューするものに応じて、テキストには毎回異なるデータが含まれます。

カスタムセルで他にやるべきことはありますか? 前もって感謝します。

4

2 に答える 2

1

あなたはあなたの質問に言及reloadRowsAtIndexPaths:していますが、その方法は実際にはreloadRowsAtIndexPaths:withRowAnimation:. リロードをアニメーション化できるという事実は重要です。たとえば、アニメーション化するUITableViewRowAnimationLeftには、テーブル ビューで古いセルをスライドさせながら、新しいセルをスライドさせる必要があります。古いセルと新しいセルの両方が同時に画面に表示されるため、テーブル ビューで同じUITableViewCellオブジェクトを両方に使用することはできません。これが、「そのセルをデキューせず、新しいセルを再作成する」理由です。古いものがまだ表示されているため、新しいものが必要です。

メッセージを受信したら、要求された行のデータと、要求された行のデータのみtableView:cellForRowAtIndexPath:を表示するために、(キューから取り出されたか、新しく作成されたかにかかわらず) セルを完全に初期化する必要があります。

indexPathまた、 (アニメーション中に) 同じ行に 2 つのセルが存在する可能性があるため、行からセルへの独自のマッピングを保持することはできません。代わりに、現在行のデータを表示しているセルを取得する必要がある場合はいつでも、cellForRowAtIndexPath:メッセージを送信してテーブル ビューにセルを要求する必要があります。

于 2012-06-16T18:17:28.777 に答える
0

あなたが示すコードから、新しいセルが作成されたときにのみセルのコンテンツを設定するように見えます。どのセルがキャッシュから渡されるかを知る方法がないため、新しいセルか再利用されているセルかを構成する必要があります。

于 2012-06-16T18:12:22.643 に答える