迅速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 } }