美文网首页iOS进阶+实战程序员iOS Developer
iOS开发之UIRefreshControl使用踩坑

iOS开发之UIRefreshControl使用踩坑

作者: YungFan | 来源:发表于2018-03-27 16:00 被阅读379次

    问题描述

    接上一个话题,实现了TabBar的点击刷新以后,开始继续写完成功能,刷新UITableView,于是考虑到iOS 10以后,UIScrollView已经有UIRefreshControl的属性了,干脆用自带的写。于是就有了如下的代码:

    1. 添加UIRefreshControl到UITableView上去
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
        
    refreshControl.tintColor = [UIColor grayColor];
        
    refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
        
    [refreshControl addTarget:self action:@selector(refreshTabView) forControlEvents:UIControlEventValueChanged];
    
    self.newsTableView.refreshControl = refreshControl;
    
    
    1. 下拉刷新事件
    -(void)refreshTabView
    {
        //添加一条数据
        [self.newsData insertObject:[self.newsData firstObject] atIndex:0];
    
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self.newsTableView reloadData];
            
            if ([self.newsTableView.refreshControl isRefreshing]) {
                
                [self.newsTableView.refreshControl endRefreshing];
            }
        });
    }
    
    1. TabBar点击事件
    -(void)doubleClickTab:(NSNotification *)notification{
        
        //这里有个坑 就是直接用NSInteger接收会有问题 数字不对
        //因为上个界面传过来的时候封装成了对象,所以用NSNumber接收后再取值
        NSNumber *index = notification.object;
        
        if ([index intValue] == 1) {
            //刷新
            [self.newsTableView.refreshControl beginRefreshing];
            
        }
        
    }
    

    此时的效果如下,直接下拉刷新可以,但是点击TabBar不可以:

    刷新异常情况.gif

    分析问题

    经过Google帮助,终于知道原因,因为系统自带的UIRefreshControl有两个陷阱:

    1. 调用-beginRefreshing方法不会触发UIControlEventValueChanged事件;
    2. 调用-beginRefreshing方法不会自动显示进度圈。

    也就是说,只是调用-beginRefreshing方法是不管用的,那么对应的需要做两件事:

    1. 手动设置UIRefreshControl的事件;
    2. 手动设置UITableView的ContentOffset,露出进度圈。

    解决问题

    只需要修改上面第3步中的代码如下:

    -(void)doubleClickTab:(NSNotification *)notification{
    
        //这里有个坑 就是直接用NSInteger接收会有问题 数字不对
        //因为上个界面传过来的时候封装成了对象,所以用NSNumber接收后再取值
        NSNumber *index = notification.object;
        
        if ([index intValue] == 1) {
            //刷新
            //animated不要为YES,否则菊花会卡死
            [self.newsTableView setContentOffset:CGPointMake(0, self.newsTableView.contentOffset.y - self.newsTableView.refreshControl.frame.size.height) animated:NO];
            
            [self.newsTableView.refreshControl beginRefreshing];
            
            [self.newsTableView.refreshControl sendActionsForControlEvents:UIControlEventValueChanged];
        }
        
    }
    

    最终效果:


    刷新正常情况.gif

    相关文章

      网友评论

      • 英俊神武:我觉得不支持上拉,这是个硬伤
        YungFan:@我是宋仲基 原生的不带这个功能 苹果应该有自己的考虑吧 其实很多功能国内用的多 国在用的不多
      • 请叫我小白同学:感谢指坑,上拉,加载更多,应该如何实现呢?
        YungFan:@请叫我小白同学 原生的没这个功能 可以考虑第三方 如MJRefresh

      本文标题:iOS开发之UIRefreshControl使用踩坑

      本文链接:https://www.haomeiwen.com/subject/mrrscftx.html