如何在Swift页面中组织动态数量的UITableView

时间:2019-07-07 09:53:54

标签: swift xcode appcode

我必须将一组动态数据整理成一组刷卡表。现在,我正在使用UIPageViewController来执行此任务,但是它从网络上动态上传数据时存在一些问题-如果我们以太快的速度滑动页面,我们可能会超载数据加载,并且程序可能会崩溃。现在,要解决此问题,我要提前5页上传数据,但是我认为这是一个糟糕的解决方案,希望此任务有一个正确的解决方案。 我发现了另一个想法-使用UICollectionView来完成此任务,但是我不确定,我可以在此方法中将表用作UICollectionViewCell,而且我不确定该决定是否正确。 在这种情况下,您有什么建议

1 个答案:

答案 0 :(得分:1)

这是我处理这种情况的方法

  • 首先,我将使ViewController包含如下的collectionView-确保添加您自己的约束,但是您愿意-
import UIKit

class ViewController: UIViewController {

// IBOutlets
    @IBOutlet var collectionView: UICollectionView!

// MARK: Lifecycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        setupCollectionView()
    }

// MARK: Private Methods
    private func setupCollectionView(){
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.separatorStyle = .none
        collectionView?.register(UINib(nibName: /* Your cell NibName */, bundle: nil), forCellWithReuseIdentifier: /* Your cell Id*/)
        collectionView?.isPagingEnabled = true
    }

// MARK: UICollectionView Methods
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return zekr?.subNodes?.count ?? 0
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = zekrCollectionView.dequeueReusableCell(withReuseIdentifier: /* Your cell Id */, for: indexPath) as! /* Your cell Type */
        cell.cellData = /* your list that corresponds with the list that table will take */
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // this is to make each cell fill the whole page
        return CGSize(width: view.frame.width, height: view.frame.height)
    }


}
  • 然后,您将在每个collectionViewCell内添加tableview,并确保如下所示在collectionViewCell内实现tableView的委托和数据源
import UIKit

class CollectionViewCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate {

    // MARK: IBOutlets
    @IBOutlet weak var pageTable: UITableView!

    var cellData: [/*Your List*/]?

    // MARK: Properties
    var cellData: /*Your List*/?{
        didSet{
            if let value = cellData {
                /* reload your table */
            }
        }
    }

    // MARK: Life Cycle Methods
    override func awakeFromNib() {
        super.awakeFromNib()
        setupPageTable()
    }

    private func setupPageTable(){
        pageTable.delegate = self
        pageTable.dataSource = self
        pageTable.register(UINib(nibName: /* TableView Cell NibName */, bundle: nil), forCellReuseIdentifier: /* CellId */)
    }

    // MARK: UITableViewDelegate
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cellData?.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: /* CellId */) as! /* Cell Type */
        cell.cellDataModel = cellData?[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let cell: UITableViewCell = cellData?[indexPath.row]
        return cell.contentView.frame.size.height
    }

}
  • ,最后您的tableViewCell将保持不变,但是您最初将其传递给cellDataModel

  • 如果水平滚动不适用于collectionView,则可以根据您的快速版本使用Google解决方案

  • 水平或水平滚动每个包含tableView的单元格以及垂直滚动在android中充当viewPager的单元格时,您将在家里或正在使用的任何VC上使用collectionView的结果