迅速ios添加无限滚动分页到uitableview

我不知道如果tableview有任何内置函数来添加无限滚动/分页。

现在我的VC看起来像这样:

var data: JSON! = [] override func viewDidLoad() { super.viewDidLoad() //Init start height of cell self.tableView.estimatedRowHeight = 122 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.delegate = self self.tableView.dataSource = self savedLoader.startAnimation() //Load first page loadSaved(1) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("aCell") as! SavedTableViewCell let info = data[indexPath.row] cell.configureWithData(info) return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { performSegueWithIdentifier("WebSegue", sender: indexPath) tableView.deselectRowAtIndexPath(indexPath, animated: false) } 

我使用loadSaved(1)通过给函数加载我想要加载的当前页面来获取我的数据。 该函数使用alomofire发出API请求,然后填充var数据:JSON! = []与应该显示的数据

所以我想要做的是当我滚动到tableview的loadSaved(2)的底部应该被调用加载更多的数据到tableview

UITableViewDelegate有一个表“View(_:will Display:for Row At:)”方法 ,它告诉委托人表格视图将为特定的行绘制一个单元格。

在你的情况下,我会使用这样的事情:

 override open func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == data.count-1 { //you might decide to load sooner than -1 I guess... //load more into data here } } 

根据您的代码,您可能需要对此进行一些检查,以确保您在加载所有数据时不会以无限循环结束。

不, UITableView没有任何内置函数来实现无限滚动或按需加载单元格。 你可以使用的是在UITableView默认实现的UIScrollViewDelegate的函数scrollViewDidScroll(_:) ,这样就知道当用户滚动超过UITableView定义的原始高度时。

例如像这样的代码:

 var indexOfPageToRequest = 1 override func scrollViewDidScroll(scrollView: UIScrollView) { // calculates where the user is in the y-axis let offsetY = scrollView.contentOffset.y let contentHeight = scrollView.contentSize.height if offsetY > contentHeight - scrollView.frame.size.height { // increments the number of the page to request indexOfPageToRequest += 1 // call your API for more data loadSaved(indexOfPageToRequest) // tell the table view to reload with the new data self.tableView.reloadData() } } 

为了实现在UITableView的最后添加其他元素的结果,您应该将新元素添加到数据源中,在您的函数loadSaved(numberOfPage)的数据中添加新元素。

我希望这可以帮助你。

我修改了Victor的答案,并用它作为,

 var indexOfPageRequest = 1 var loadingStatus = false func loadData(){ if !loadingStatus{ loadingStatus = true viewModel.getData(pageIndex: indexOfPageRequest) } } override func scrollViewDidScroll(_ scrollView: UIScrollView) { // calculates where the user is in the y-axis let offsetY = scrollView.contentOffset.y let contentHeight = scrollView.contentSize.height if offsetY > contentHeight - scrollView.frame.size.height { // increments the number of the page to request indexOfPageRequest += 1 // call your API for more data loadData() // tell the table view to reload with the new data self.tableView.reloadData() } } 

当您收到数据时,将loadingStatus重置为true。 不检查视图是否已经加载更多的数据,tableview闪烁。

上面的Ans也是对的,但是也可能是一些帮助这个代码的。

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath){ if(indexPath.row == self.arryOfData.count-1){ if(self.pageNumber <= self.resPgNumber){ if(remaining != 0){ let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray) spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44)) spinner.startAnimating() tableView.tableFooterView = spinner tableView.tableFooterView?.isHidden = false DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.flgActivity = false self.getActiveOrdersList() } } else{ tableView.tableFooterView?.removeFromSuperview() let view = UIView() view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) tableView.tableFooterView = view tableView.tableFooterView?.isHidden = true } } else{ tableView.tableFooterView?.removeFromSuperview() let view = UIView() view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) tableView.tableFooterView = view tableView.tableFooterView?.isHidden = true } } else{ tableView.tableFooterView?.removeFromSuperview() let view = UIView() view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) tableView.tableFooterView = view tableView.tableFooterView?.isHidden = true } }