2013-03-23 88 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

相关问题