专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构

上拉加载更多数据

  • 目标: 在用户将tableView滚动到最后一个cell的时候,主动去加载更多数据
  • 使用 第三方框架 SVPullToRefresh 来实现 在用户将 tableView 滚动到 最后 一个 cell 的时候,主动去加载更多数据
  • Podfile 添加 pod 'SVPullToRefresh'内容如下:
    pod 'SVPullToRefresh'
    
  • 在终端切换到 Podfile 所在目录, 执行 pod update 更新 Pods
  • HMHomeViewController 文件 import SVPullToRefresh
  • SVPullToRefresh上拉加载更多 控件相关函数
    • func addInfiniteScrollingWithActionHandler(actionHandler: (() -> Void)!) 添加 上拉加载更多控件 事件, 注意: 如果没有添加 上拉加载更多控件 事件, 上拉加载更多控件是不会显示出来的.
    • var showsInfiniteScrolling: Bool: 显示/隐藏 上拉加载控件
    • 这2个函数都是 UIScrollView 的扩展.
  • HMHomeViewControllerprepareTableView 里面添加: 上拉加载更多控件 事件
    // 添加上拉加载更多控件
    tableView.addInfiniteScrolling { 
      self.loadMoreStatus()
    }
    
  • 实现 loadMoreStatus 方法:

    /// 加载更多数据
    private func loadMoreStatus() -> Void {
      // 获取微博最小的id
      let max_id = statusVMs?.last?.status.id ?? 0
    
      // 没有数据
      if max_id == 0 {
          print("id为0不能上拉加载更多数据")
          return
      }
    
      // 加载更多微博数据
      HMStatusListViewModel.shared.loadStatus(since_id: 0, max_id: max_id) { (statusVMs: [HMStatusViewModel]?, error: Error?) in
    
          // 停止上拉加载数据动画
          self.tableView.infiniteScrollingView.stopAnimating()
    
          if error != nil {
              print("上拉刷新数据失败: \(max_id)")
              SVProgressHUD.showError(withStatus: "上拉刷新数据失败")
              return
          }
    
          // 上拉加载数据成功
          print("上拉加载数据成功 = \(statusVMs?.count)")
          self.statusVMs = self.statusVMs! + statusVMs!
      }
    }
    
  • 发现上拉加载出来的第一条数据是重复的,在 HMStatusListViewModel 中的 loadStatus 方法里面将 parameters["max_id"] = max_id 修改成 parameters["max_id"] = max_id - 1

    if since_id > 0 {
      parameters["since_id"] = since_id
    } else if max_id > 0 {
      // 别人传递了max_id.添加到字典里面
      parameters["max_id"] = max_id - 1
    }
    

results matching ""

    No results matching ""