7

UITableView のreloadDataメソッドに問題があります。新しいセルが追加または削除されている場合にのみ cellForRowAtIndexPath を呼び出すことがわかりました。

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

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

4

6 に答える 6

10

問題が見つかりました。if(cell == nil)ブロックにセルのカスタマイズ コードがあったため、セルがリサイクルされていたため、変更されていませんでした。そのブロックからカスタマイズ コードを取り出すと、問題が修正されました。

于 2012-01-24T23:13:50.273 に答える
0

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

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

- (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;
}
于 2012-12-18T07:30:15.090 に答える
0

テーブルビューに 50 行ある場合でも、一度に表示できる数のセルしか存在しません。これが、reuseIdentifier の背後にあるすべての話です。したがって、「すべてのセル」を強制することはありません。新しいセルが表示されると、データが動的に読み込まれます。

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

于 2012-01-21T18:57:09.197 に答える
0

さて、テーブル ビューcellForRowAtIndexPathは表示されているセルのみを呼び出しますが、呼び出した場合はreloadDataそれが行われるため、ここで何か他のことが起こっており、それが何であるかはわかりません。

于 2012-01-21T18:34:06.660 に答える