簡體   English   中英

UIRefreshControl - 如何在觸摸釋放后進行刷新操作?

[英]UIRefreshControl - How do I make the refresh action occur after the touch is released?

長時間監聽,第一次調用堆棧溢出。 要溫柔。

我在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];
}

如何延遲刷新:功能,直到用戶從拉動中移開手指?

我也遇到了同樣的問題。 我認為我的方法不是很好,但看起來很有效。

  1. Init 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]; } 

希望它會對你有所幫助。

UIRefreshControl已經在“正確”時間開始提供住宿。 pull-to-refresh控件的正確行為是在用戶超過“足夠遠”閾值后開始刷新,而不是在用戶釋放拖動時。

為了實現這一點,您需要修改-refresh:方法以檢查控件何時轉換為refreshing狀態:

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

請注意,您為(... refresh code ...)調用的任何方法都應該是異步的,這樣您的UI就不會凍結。 您應該更改為主隊列並在(... refresh code ...)塊的末尾調用-endRefreshing ,而不是在-refresh:的結尾處-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
            });
        });
    }
}

將控件事件更改為UIControlEventTouchUpInside將不起作用,因為UIRefreshControl不是要與之直接交互的UI組件。 用戶永遠不會觸摸 UIRefreshControl ,因此不能觸發UIControlEventTouchUpInside事件。

可以通過使用NSRunLoop來實現僅在手指抬起時調度刷新。 調用-(void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block; 在陣列中使用NSRunLoopDefaultMode

當觸摸仍然保持時,runloop模式是UITrackingRunLoopMode ,它將僅在升空后返回到默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM