Как организовать динамический номер uitableview как перелистывание страниц в swift - PullRequest
0 голосов
/ 07 июля 2019

Существует динамический набор данных, который я должен организовать как набор перелистываемых таблиц.Сейчас я использую UIPageViewController для этой задачи, но у него есть некоторые проблемы с динамически загружаемыми данными из сети - если мы перелистываем страницы слишком быстро, мы можем перегнать загрузку данных, и программа может аварийно завершить работу.Теперь, чтобы решить эту проблему, я загружаю данные заранее за 5 страниц, но я думаю, что это плохое решение, и я надеюсь, что есть правильное решение для этой задачи.Я нашел другую идею - использовать UICollectionView для этой задачи, но я не уверен, что я могу использовать таблицы как UICollectionViewCell в этом методе, и я не уверен, что это решение является правильным.Что вы можете порекомендовать в этой ситуации

1 Ответ

1 голос
/ 07 июля 2019

вот мой подход к такому делу

  • сначала у меня будет 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)
    }


}
  • затем вы добавите tableview внутри каждого collectionViewCell и наверняка выполните делегат и источник данных для tableView внутри collectionViewCell, как показано ниже
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 у вас дома или вне зависимости от того, на каком VC вы находитесь, с горизонтальной прокруткой каждой ячейки, содержащей tableView, с ее ячейками с вертикальной прокруткой, действующими как viewPager в Android

...