2013-03-23 32 views
21

長時間監聽器,第一次調用此處堆棧溢出。要溫柔。UIRefreshControl - 如何在觸摸釋放後進行刷新操作?

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

我怎樣才能延緩刷新:函數,直到用戶從下拉消除他們的手指?

回答

25

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

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

希望它能幫助你。

+1

如果用戶緩慢進行拖放操作,此解決方案將起作用。如果它幾乎像一個輕彈,加載輪將運行,但刷新:函數將不會被調用,直到表再次移動。 編輯:我改變了功能scrollViewDidEndDecelerating:它現在似乎工作正常。謝謝! – outphase 2013-03-24 00:21:27

+0

是的,你很對!現在它效果更好,謝謝你糾正我的代碼!) – Ned 2013-03-24 18:16:44

+1

這是一個小問題。如果拉下桌面視圖到足夠刷新的位置,請保持手指放下,然後回到微調器大約一半可見的位置,然後放開......這將顯示微調器旋轉並且不會發生任何事情。 – 2014-06-16 18:05:52

18

UIRefreshControl已經在「正確」時間開始住宿。拉到刷新控制的正確行爲是在用戶跨越某個「足夠遠」的閾值後開始刷新,而不是在用戶釋放其拖動時。

爲了做到這一點,你需要修改-refresh:方法來檢查當控制已經轉變爲refreshing狀態:

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

請注意,你叫你的(... refresh code ...)任何方法應該是異步的,以便您的用戶界面不會凍結。你應該改變主隊列,並在您的(... refresh code ...)塊的末尾調用-endRefreshing,而不是在-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事件可以觸發。

+2

這實際上是正確答案! – 2013-10-21 16:23:10

+0

它不起作用。刷新方法只需調用一次,然後用戶擡起手指(用ios 10.2測試) – user1105951 2017-01-12 18:46:51

相關問題