5

UIRefreshControlの実装に問題があります。プルダウンすると、「blob」は完全に正常に機能し、更新スピナーは正常に機能しますが、更新中はtableViewがスピナーまでスクロールしません。代わりに、更新が完了するまで元の場所に留まり、完了すると画面の上部に戻ります。

更新を行うコードは次のとおりです。

- (void)viewDidLoad {
    self.refreshControl = [[UIRefreshControl alloc] init];
    [self.refreshControl addTarget:self action:@selector(refreshView:)forControlEvents:UIControlEventValueChanged];
}

- (void)refreshView:(UIRefreshControl *)refresh  {
    dispatch_async(dispatch_get_main_queue(), ^{
        (...code to get new data here...)
        [self.refreshControl endRefreshing];
    }
}

dispatch_asyncがないと、更新スピナーでさえ機能しないことがわかりました-プルダウンされたビットは真っ白に見えます

誰かが私が間違っている可能性があることの手がかりを持っていますか?私が見つけたすべての実装例は、私が行っていることと一致しているようです。APIドキュメントには、何かが欠けていることを示唆するものは何も見つかりませんでした。

4

1 に答える 1

16

以下に変更できます

- (void)refreshView:(UIRefreshControl *)refresh  {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // (...code to get new data here...)
        dispatch_async(dispatch_get_main_queue(), ^{
            //any UI refresh
            [self.refreshControl endRefreshing];
        });
    });
}

-refreshView:メインスレッドで呼び出され、すべてのUI更新はメインスレッドを使用します。したがって、「新しいデータを取得するためのコード」にメインスレッドを使用すると、「スタック」します。

于 2012-11-14T21:25:47.977 に答える