1

リフレッシュするためのプルに非常に奇妙なバグがあります。テーブルのデータを更新する関数があります。pull to refreshonの両方で呼び出されviewWillAppearます。この同じ機能は後者では問題なく機能しますが、プルして更新するとクラッシュします。ここに私の「リセット」機能があります

-(void)reset{
    refreshList = nil;
    isFiltered = NO;
    currentRoom = nil;
    [roomList removeAllObjects];
    NSMutableURLRequest *newRequest=[NSMutableURLRequest requestWithURL:
        [NSURL URLWithString:@"http://192.168.1.128:8080/DJService/room/list/"]
                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                        timeoutInterval:60.0];
    [newRequest setHTTPMethod:@"POST"];
    refreshList = [[NSURLConnection alloc] initWithRequest:newRequest
                                                  delegate:self];
}

ここで、pull to refresh を実行すると、次のようになります。関数に直行し、次のcellForRowAtIndexPath行でクラッシュします。

room = [roomList objectAtIndex:indexPath.row];

roomListが空で、まだ入力されていないため、クラッシュしています。私が理解していないのは、reloadDataまだ呼び出されていないときになぜこの関数に行くのかということです。上記のコードから、新しいデータを取得するために url 接続が作成され、テーブルが再ロードされるはずですが、connectionDidFinishLoadingその関数は呼び出されません。実際、テーブルまたは URL 接続の他のデリゲート関数は呼び出されません。それはまっすぐに行きcellForRowAtIndexPath、空のリストを読み込もうとします....なぜこれをやっているのですか?

これとまったく同じ関数 ( reset) が呼び出されviewWillAppear、正常に動作します。
さらにややこしいのは、テーブルに 7 つ以上の要素がある (画面がいっぱいになっている) 場合にのみ、このクラッシュが発生することです。

4

1 に答える 1

6

roomList のキャッシュを保持して、更新中であり、データが最新ではないことがわかるようにします。画面をいっぱいにするときに cellForRowAtIndexPath を呼び出す理由は、セルが画面外でデキューされるためです。プルするデータがない状態でテーブルを離れることはありません。また、pull to refresh コントローラーを記述していない場合は、reloadTable が呼び出されている可能性があります。

于 2013-09-01T19:28:23.757 に答える