上拉刷新
添加上拉刷新提示
- 添加 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; }