在 UITableView 中加载数据时,活动指示器出现问题

Posted

技术标签:

【中文标题】在 UITableView 中加载数据时,活动指示器出现问题【英文标题】:Issue with Activity Indicator While loading data in UITableView 【发布时间】:2018-05-23 15:31:15 【问题描述】:

我正在使用 php 从服务器获取记录

因为我目前有 11 条记录,所以我想在开始时只显示 6 条记录,剩余的下 5 条记录将显示用户在滚动时到达最后一个单元格的时间。所以这个过程处于工作状态,但问题出在运行时,它运行得如此之快,以至于在到达最后一行之前,所有记录都已经在滚动时显示,并且活动指示器只是在 tableView 的底部动画。

我不知道是什么问题。

我还希望当用户到达最后一个单元格时,活动指示器在加载数据时开始动画。

这是我的代码

import UIKit
import AlamofireImage

struct property
let property_Id     : String
let propertyTitle   : String
let imageURL        : String
let user_Id         : String
let area            : String
let bed             : String
let unit            : String
let bath            : String
let price           : String

class searchRecordsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,favouriteButtonTableViewCellDelegate 

var y                           = 6
var m                           = 12
@IBOutlet weak var tableView    : UITableView!
var RESULT                      : [NSDictionary] = []
var myProperty                  = [property]()
var myPropertyCopy              = [property]()

override func viewDidLoad() 
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


//MARK: Getting dictionary data from previous controller

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    self.navigationItem.title = "Results"
    self.navigationController?.navigationBar.tintColor = UIColor.black

    //MARK: Getting dictionary data from previous controller
    for item in RESULT  

        let propertyInfo = property(property_Id: String(item["propertyId"]! as! Int), propertyTitle: item["propertyTitle"]! as! String, imageURL: item["imagePath"]! as! String, user_Id: String(item["userId"]! as! Int), area: item["area"]! as! String, bed: item["bed"]! as! String, unit: item["unit"]! as! String, bath: item["bath"]! as! String, price: item["price"]! as! String )

        myProperty.append(propertyInfo)

    
    //MARK: Inserting first 6 records in Array
    for i in 0 ..< 6 
        if !(myProperty.indices.contains(i)) 
            break
        
        myPropertyCopy.append(myProperty[i])

    




func downloadImage(imagePath : String, theIMAGEVIEW : UIImageView) 
    let myUrl = URL(string: URL_IP+imagePath);

    //MARK: AlamofireImage to download the image
    theIMAGEVIEW.af_setImage(withURL: myUrl!, placeholderImage: #imageLiteral(resourceName: "addProperty"), filter: nil, progress: nil, runImageTransitionIfCached: true, completion: nil)


func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int

    return myPropertyCopy.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCell(withIdentifier: "RecordCell") as! searchrecordsTableViewCell

    let property = myPropertyCopy[indexPath.row]
    cell.area.text = property.area+" "+property.unit
    if property.bath == ""
        cell.bath.text = property.bath
    
    else
        cell.bath.text = property.bath+" Baths"
    
    if property.bed == ""
        cell.bed.text = property.bed
    
    else
        cell.bed.text = property.bed+" Baths"
    
    cell.propertyTitle.text = property.propertyTitle
    cell.price.text = convertAMOUNT(price : property.price)
    downloadImage(imagePath: property.imageURL, theIMAGEVIEW: cell.myImageView)
    //----
    cell.delegate = self

    return cell



func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 

    if myPropertyCopy.count != myProperty.count
        let lastRow = myPropertyCopy.count - 1
        if indexPath.row == lastRow 
            let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
            spinner.startAnimating()
            spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))

            self.tableView.tableFooterView = spinner
            self.tableView.tableFooterView?.isHidden = false
            moreData()

        

    


func moreData()

    for i in y ..< m 
        if !(myProperty.indices.contains(i)) 

            break

        
        myPropertyCopy.append(myProperty[i])

    
        y = y + 10
        m = m + 10
        self.tableView.reloadData()






目前我的 TableView 看起来像 See output here

提前致谢。

【问题讨论】:

这里的任何人,请帮助我 如果所有结果都加载了为什么要再次拆分 因为来自服务器,一次至少有 50 到 100 条记录,所以我不想一次显示,因为这很奇怪,所以这就是为什么我想以 25 个块显示,当用户到达时在最后一个单元格滚动时,activityindicator 开始动画,然后加载下一个 25 每次右显示页脚时,您都会在页脚中显示微调器..一旦您获取下一组记录..微调器动画您禁用或隐藏页脚 谢谢,我刚做完:) 【参考方案1】:

经过长时间的练习,我已经解决了我的问题,我刚刚添加了 UIScrollView 委托函数,用于检查用户是否到达最后一个单元格,然后启动 activityIndi​​cator 3 秒,然后加载数据,就是这样。

因为我只有非常少量的数据,这就是为什么我在获取数据之前开始使用 UIactivityIndi​​cator 3 秒。

 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 

    // UITableView only moves in one direction, y axis
    let currentOffset = scrollView.contentOffset.y
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height

    if maximumOffset - currentOffset <= 10.0 
        let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)

        if myPropertyCopy.count != myProperty.count 

            //print("this is the last cell")

            spinner.startAnimating()
            spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
            spinner.hidesWhenStopped = true
            self.tableView.tableFooterView = spinner
            self.tableView.tableFooterView?.isHidden = false

            DispatchQueue.main.asyncAfter(deadline: .now() + 3) 
                //MARK: Loading more data
                self.moreData()

            

        
        else
            self.tableView.tableFooterView?.isHidden = true
            spinner.stopAnimating()
        
    


【讨论】:

以上是关于在 UITableView 中加载数据时,活动指示器出现问题的主要内容,如果未能解决你的问题,请参考以下文章

数据未在 UITableView 中加载。可能是啥问题?

如何在uitableview中加载数据而不每次都重新加载

在 UITableView 中加载图像时遇到问题

在 coredata 中加载图像时 UITableView 滞后

尝试在 UITableView 中加载大量 JSON 数据需要很长时间

PDF uiwebview 加载时未显示活动指示器