29

長年のリスナー、スタック オーバーフローでの初めての呼び出し元。穏やかな。

テーブルのデータを更新するために UITableView に UIRefreshControl を実装しています。他のプル ツー リフレッシュの実装では、プルのリフレッシュ距離内でユーザーの指が離されるまで、リフレッシュ プロセスは開始されません。UIRefreshControl は、このカスタマイズがあるようにすぐには見えません。

私の UIRefreshControl 初期化コード:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:refreshControl];

私のリフレッシュ: コードはかなり基本的です:

-(void)refresh:(id)sender {
(... refresh code ...)
[sender endRefreshing];
}

ユーザーがプルから指を離すまで、refresh: 関数を遅らせるにはどうすればよいですか?

4

3 に答える 3

39

私も同じ問題で立ち往生しています。私のアプローチはあまりいいとは思いませんが、うまくいくようです。

  1. 初期化UIRefreshControl

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl = refreshControl;
    
  2. UIRefreshControlユーザーがテーブルのドラッグを終了したときの状態を確認する (UITableViewDelegateに準拠UIScrollViewDelegate)

    - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
    {    
        if( self.refreshControl.isRefreshing )
            [self refresh];
    }
    
  3. テーブルを更新

    - (void)refresh
    {
        [self.refreshControl endRefreshing];
    
        // TODO: Update here your items
    
        [self.tableView reloadData];
    }
    

それがあなたを助けることを願っています。

于 2013-03-23T20:58:22.947 に答える
20

UIRefreshControl「適切な」時間に開始するための宿泊施設がすでにあります。プルして更新するコントロールの正しい動作は、ユーザーがドラッグを離したときではなく、ユーザーが「十分な」しきい値を超えた後に更新を開始することです。

これを実現するには、メソッドを変更して、コントロールがいつ状態-refresh:に遷移したかを確認する必要があります。refreshing

-(void)refresh:(id)sender {
    UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
    if(refreshControl.refreshing) {
        (... refresh code ...)
    }
}

(... refresh code ...)UI がフリーズしないように、呼び出すメソッドはすべて非同期にする必要があることに注意してください。の最後ではなく、メイン キューに変更して、ブロック-endRefreshingの最後で呼び出す必要があります。(... refresh code ...)-refresh:

- (void)refresh:(id)sender {
    __weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
    if(refreshControl.refreshing) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            /* (... refresh code ...) */
            dispatch_sync(dispatch_get_main_queue(), ^{
                [refreshControl endRefreshing];
                //reload the table here, too
            });
        });
    }
}

は直接操作することを意図した UI コンポーネントではないUIControlEventTouchUpInsideため、コントロール イベントを に変更しても機能しません。UIRefreshControlユーザーが に触れることはないUIRefreshControlため、UIControlEventTouchUpInsideイベントをトリガーすることはできません。

于 2013-03-23T22:10:31.680 に答える