UICollectionViewCells в UICollectionView, встроенном в UITableView, не отображаются должным образом - PullRequest
0 голосов
/ 14 мая 2018

У меня проблемы с отображением пользовательских UICollectionViewCells в представлении коллекции UICollectionViewController.

Потенциально важные факторы:

  • Я создаю свои макеты программно, а не использую раскадровку
  • Представление коллекции является встроенным в качестве подпредставления UITableViewCell в UITableView в моем основном UIViewController.
  • Я использую UICollectionViewFlowLayout с горизонтальным направлением
  • Ячейка заполняет всю ширину и высоту своего родителя.

Вещи, которые я заметил при тестировании:

  • В текущем состоянии приложения cellForItemAt indexPath вызывается только один раз для первой отображаемой ячейки.
  • Когда первая ячейка нажата, она исчезает. Я не нашел способа заставить его появиться снова.
  • Я могу скользить туда, где должны быть другие ячейки, и там есть правильное количество «пустых ячеек», но сами ячейки не появляются.

Я пытался включить только то, что, по моему мнению, является необходимым кодом, чтобы уменьшить размер этого поста, но, пожалуйста, дайте мне знать, если есть что-то, что я не учел. Спасибо за любую помощь или предложения. Кроме того, я надеялся получить руководство по отладке с использованием xcode в подобных ситуациях в будущем. Кто-нибудь знает какие-либо руководства или книги, которые дают советы по поиску подобных вопросов? У меня есть небольшой опыт работы с инструментами отладки gdb / visual studio, но Xcode и фреймворк оказываются для меня немного сложными, когда дело доходит до отладки. Еще раз спасибо.

Определение и ограничения представления таблицы:

...

let trainingTableViewController = TrainingTableViewController()

lazy var trainingTableView: UITableView = {
    let tableView = UITableView()
    tableView.dataSource = trainingTableViewController
    tableView.delegate = trainingTableViewController
    tableView.register(TrainingLogoCell.self, forCellReuseIdentifier: "trainingLogoID")
    tableView.register(TrainingProgressCell.self, forCellReuseIdentifier: "trainingProgressID")
    tableView.register(TrainingProgressPageControlCell.self, forCellReuseIdentifier: "trainingProgressPageControlID")
    tableView.register(TrainingWeekCell.self, forCellReuseIdentifier: "trainingWeekID")
    tableView.separatorStyle = .none
    tableView.backgroundColor = .clear
    tableView.translatesAutoresizingMaskIntoConstraints = false
    return tableView
}()

override func viewDidLoad() {
    super.viewDidLoad()

    ...

    view.addSubview(trainingTableView)
    trainingTableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true // TODO: see about anchoring to bottom of navigation
    trainingTableView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 25).isActive = true
    trainingTableView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -25).isActive = true
    trainingTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}

Класс TableView с ячейкой CollectionView

class TrainingTableViewController: NSObject, UITableViewDelegate, UITableViewDataSource {

    ...

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "trainingLogoID", for: indexPath)
            return cell
        } else if indexPath.section == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "trainingProgressID", for: indexPath)
            return cell
        }
        else if indexPath.section == 2 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "trainingProgressPageControlID", for: indexPath)
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "trainingWeekID", for: indexPath)
            return cell
        }
    }

    ...        

class TrainingProgressCell: UITableViewCell {
    let trainingProgressCollectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.minimumLineSpacing = 0
        let collectionViewController = TrainingProgressCollectionViewController(collectionViewLayout: layout)
        collectionViewController.collectionView!.isPagingEnabled = true
        collectionViewController.collectionView!.backgroundColor = .clear
        collectionViewController.collectionView!.translatesAutoresizingMaskIntoConstraints = false
        return collectionViewController.collectionView!
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        contentView.heightAnchor.constraint(equalToConstant: 250).isActive = true
        backgroundColor = UIColor.init(rgb: 0x333333)
        layer.cornerRadius = 10
        selectionStyle = UITableViewCellSelectionStyle.none

        contentView.addSubview(trainingProgressCollectionView)
        trainingProgressCollectionView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
        trainingProgressCollectionView.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
        trainingProgressCollectionView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
        trainingProgressCollectionView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

...

Мой класс UICollectionView

import UIKit

private let reuseIdentifier = "trainingProgressCollectionViewID"

class TrainingProgressCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView!.register(TrainingProgressCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    }

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

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        print(String(indexPath.row))
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! TrainingProgressCollectionViewCell
        cell.backgroundColor = .red
        cell.dayLabel.text = "Day " + String(indexPath.row)
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: collectionView.frame.height)
    }
}

class TrainingProgressCollectionViewCell: UICollectionViewCell {
    var constraintsSetupDone = false

    let dayLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textColor = .white
        label.font = UIFont(name: "Montserrat-ExtraBold", size: 18)
        return label
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        contentView.addSubview(dayLabel)
        dayLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        dayLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

1 Ответ

0 голосов
/ 14 мая 2018

Необходимо, чтобы убедиться, что контроллер представления коллекции находится в области видимости.Его область действия изначально была ограничена блоком кода, в котором было определено представление коллекции, поэтому представление коллекции больше не имело источника данных или делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...