上拉刷新

  • 添加上拉刷新提示

    • 添加 tableViewFooterView 提示
    // 添加上拉刷新提示控件
    UILabel *footer = [[UILabel alloc] init];
    footer.textAlignment = NSTextAlignmentCenter;
    footer.textColor = [UIColor whiteColor];
    footer.text = @"上拉可以刷新加载跟多数据";
    footer.backgroundColor = [UIColor redColor];
    footer.CDH_height = 35;
    self.tableView.tableFooterView = footer;
    _footer = footer;
    
  • 监听scrollView的拖拽事件: 处理上拉

    • 滚到 tableView 底完全显示 tableFooterView 的时候进入上拉加载数据
    #pragma mark - ScrollView Delegate
    // 拖拽的时候就会调用
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        // 处理上拉刷新
        [self deadUpOnFooterRefresh];
    }
    
    // 处理上拉刷新
    - (void)deadUpOnFooterRefresh{
        // 如果还没有数据也不处理底部的上拉刷新, 直接返回等待加载数据即可
        if (!_topics.count) return;
        // 如果上拉刷新还没有出现则是直接返回
        if (!_footer) return;
    
        // 如果正在刷新, 则直接返回
        if(self.isFooterRefreshing) return;
    
        // 当偏移量 >= offSetY 的时候, 说明上拉的底部 footer 已经完全显示
        CGFloat offsetY = self.tableView.contentInset.bottom + self.tableView.contentSize.height - self.tableView.CDH_height;
        // 上拉刷新的 footer 完全出现了
        if (self.tableView.contentOffset.y >= offsetY) {
            // 正在加载跟个多数据
            [self footerLoadingMoreTopicsStatus];
        }else{
            // 结束刷新(恢复刷新控件的状态)
            [self didEndFooterRefreshStatus];
        }
    }
    
    // 正在加载跟个多数据
    - (void)footerLoadingMoreTopicsStatus{
        _footer.text = @"正在加载跟多数据...";
        _footer.backgroundColor = CDHRandomColor;
        _footerRefreshing = YES;
        // 上拉刷新请求数据
        [self didFooterRefreshLoadMoreTopics];
    }
    
    • 注意: 一开始的时候 tableView .contenSizede . height 是0 , 所以要在前面做处理判断是否有数据, 如果没数据就不做处理
    // 如果还没有数据也不处理底部的上拉刷新, 直接返回等待加载数据即可
    if (!_topics.count) return;
    
    • 注意: 如果在刷新则也不处理, 返回, 等待刷新即可
    // 如果上拉刷新还没有出现则是直接返回
    if (!_footer) return;
    
  • 重新请求数据, 刷新表格

    // 加载刷新数据
    - (void)didFooterRefreshLoadMoreTopics{
        // 创建请求回话
        NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
        parameters[@"a"] = @"newlist";
        parameters[@"c"] = @"data";
        parameters[@"maxtime"] = _maxtime;
        parameters[@"type"] = @1;
    
        [[AFHTTPSessionManager manager] GET:CDHRequestURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
            // 保存需要加载更多的字段
            _maxtime = responseObject[@"info"][@"maxtime"];
    
            // 写数据
            CDHAFNWriteToPlist(Essence/new_list);
    
            // 字典数组-->> 模型数组
            NSArray *moreTopics = [CDHTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
            [_topics addObjectsFromArray:moreTopics];
    
            // 刷新表格
            [self.tableView reloadData];
    
            // 结束刷新(恢复刷新控件的状态)
            [self didEndFooterRefreshStatus];
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            // 结束刷新(恢复刷新控件的状态)
            [self didEndFooterRefreshStatus];
        }];
    }
    
  • 注意: 每次都将上一次的最后一条数据被标识发给服务器, 告诉服务器从这个地方开始加载数据, 在再请求得到数据之后, 再重新给获取到最后一条数据的标识存在缓存中(赋值覆盖掉之前的最后一条数据的标识)

    // 设置请求参数
    parameters[@"maxtime"] = _maxtime;
    
    // 保存需要加载更多的字段, 下次请求更多数据的时候需要用
    _maxtime = responseObject[@"info"][@"maxtime"];
    
  • 注意: 数据拼接而不是数据覆盖,

  • 注意: 数据拼接的方法使用

     self.topics = @[10, 9, 8, 7];
     moreTopics = @[6, 5, 4, 3];
    
     [self.topics addObject:moreTopics];
     // self.topics = @[10, 9, 8, 7, @[6, 5, 4, 3]];
    
     [self.topics addObjectsFromArray:moreTopics];
     // self.topics = @[10, 9, 8, 7, 6, 5, 4, 3];
    
    NSArray *moreTopics = [CDHTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
    // 注意拼接使用的是 addObjectsFromArray: 这个方法
    [_topics addObjectsFromArray:moreTopics];
    
  • 注意: tableViewFooterView 是有数据的时候才会出现在 tableVIew 的footView, 如果没有数据则也不显示

    #pragma mark - Table view data source
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // 一开始的时候如果没有数据这隐藏 footerView
        _footer.hidden = (self.topics.count == 0);
        return _topics.count;
    }
    
  • 注意: 这里不管是成功还是失败都要修改显示的状态

    // 结束刷新(恢复刷新控件的状态)
    [self didEndFooterRefreshStatus];
    
    // 结束刷新(恢复刷新控件的状态)
    - (void)didEndFooterRefreshStatus{
        _footer.text = @"上拉可以刷新";
        _footer.backgroundColor = [UIColor redColor];
        _footerRefreshing = NO;
    }
    


results matching ""

    No results matching ""