2012-01-21 13 views
5

私はUITableViewのreloadDataメソッドに問題があります。私は、新しいセルが追加または削除された場合にのみcellForRowAtIndexPathを呼び出すことを発見しました。強制的にUITableViewがcellForRowAtIndexPathを呼び出す:すべてのセル

例:5つのセルがあり、それぞれに5つの文字列が含まれています。新しいセルを追加してreloadDataを呼び出すと、テーブルが更新されて表示されます。しかし、5つのセルのうちの1つに入ったら、新しい文字列を追加してからreloadDataを呼び出して、テーブルビューのデリゲートメソッドは何も呼び出されません。

私の質問:表示されているすべてのセルのデータを完全に再読み込みするようにテーブルビューを強制できますか?

答えて

8

ブロックにセルカスタマイズコードがありました。そのため、セルがリサイクルされていたため、変更されていませんでした。私のカスタマイズコードをそのブロックから取り出して、問題を修正しました。

+0

時間を節約できました。ありがとうございました!私はこの愚かな間違いを推測していないだろう:) – Pruthvid

+0

私のソリューションは他の誰かを助けることができてうれしい! –

0

テーブルビューは表示可能なセルのcellForRowAtIndexPathを呼び出すだけですが、reloadDataを呼び出すと、ここで何か他のことが起きているとわかります。

+0

この場合、すべてのセルが表示されます。私はデータソース(この例ではNSUserDefaults)が更新されていることを知っているので、なぜ新しいセルだけが更新されているのか正確にはわかりません。 –

+0

'cellForRowAtIndexPath'への呼び出しをトレースして、それが呼び出されていないことを証明しましたか、あるいは視覚的な変更が見られませんか? 'cellForRowAtIndexPath'が呼び出されていない場合...何が起こっているのかわかりません。その時点で、私は一歩前に戻り、 'numberOfRowsInSection'への呼び出しをトレースします。いずれにせよ、 'reloadData'を実行すると、表示されているすべてのセルに対して' cellForRowAtIndexPath'が呼び出されるべきです。 – smparkes

+0

NSLogsは、新しい行を追加するとすべてが更新されると言います。私の最初の仮説は間違っていた。別のView Controllerからテーブルビューに戻ったときにreloadDataを呼び出すと、何も呼び出されません。 –

0

テーブルビューの行数が50行であっても、一度に表示できるセル数だけ存在します。それはreuseIdentifierの背後にあるすべての話です。したがって、強制的に「すべての細胞」は存在しません。新しいセルが表示された場合、データは動的にロードされます。

セルを変更する唯一の方法は、dataSourceメソッドcellForRowAtIndexPathによって配信されるデータを変更することです。

+1

私は質問に間違いました。私は今それを更新しました。 –

+0

'reloadRowsAtIndexPaths:withRowAnimation:'ちょっと調べてみると...これを解決策にしないでください。 – Jodocus

+0

これも機能しません。それは効果がありません。 –

0

コードをif (cell == nil)ブロックから削除しないでください。代わりに、作成しているセルの代表的な識別子を作成します。セルの内容のすべてが識別子で参照されていることを確認してください。たとえば、3つの数字が表示されている場合は、そのようなコンテンツを持つセルのみを参照するユニークな方法で、識別子に3つの数字を指定してください。

クラスに3つのNSArrayプロパティ、array1、array2、およびarray3があり、NSNumberオブジェクトの内側にint値がラップされているとします。あなたがのUITableViewを埋めるために、これらのNSArraysを使用したい、これは私がしたいものです。

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@", 
          [[array1 objectAtIndex:indexPath.row] intValue], 
          [[array2 objectAtIndex:indexPath.row] intValue], 
          [[array3 objectAtIndex:indexPath.row] intValue]]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:identifier] autorelease]; 

     //Build your cell here. 
    } 

    return cell; 
} 
1

私はセクションをリロードすると、より容易にデータを再ロードすることを発見しました。あなただけの1つのセクションを持っている場合は、試すことができます:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

1

あなたが試すことができ、この

[tableView reloadData]; 

またはcommitEditingStyle方法でこれを入れ

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; 

関連する問題