Ячейки не будут отображаться в UICollectionView - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать UICollectionView и отобразить там несколько ячеек.

Это мой код:

    class MainVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

        var mForecast = [CustomCollectionViewCell]()

        let CVCellIdentifier = "forecastCell"

        lazy var mCollectionView: UICollectionView = {

            var collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 300, height: 150), collectionViewLayout: UICollectionViewFlowLayout())
            collectionView.clipsToBounds = true
            collectionView.backgroundColor = .red

            collectionView.translatesAutoresizingMaskIntoConstraints = false
            return collectionView

        }()

        override func viewDidLoad() {

            super.viewDidLoad()
            view.backgroundColor = UIColor(red: 80/255, green: 135/255, blue: 179/255, alpha: 1.0)

            setupNavBar()
            self.navigationItem.searchController = mSearchBarController

            setupMainWeatherIcon()
            fillArrayWithData()
            mCollectionView.register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: CVCellIdentifier)
            mCollectionView.dataSource = self
            mCollectionView.delegate = self

        }

    private func fillArrayWithData(){
        for _ in 1...6 {
            let forecastCell: ForecastCell = ForecastCell()

            forecastCell.mDayLabel = "DAY-TEST"
            forecastCell.mWeatherIcon = UIImage(named: "partly-cloudy")
            forecastCell.mTempLabel = "TEMP-TEST"

            mForecast.append(forecastCell)
        }

        mCollectionView.reloadData()
    }
        //MARK: COLLECTION VIEW METHODS
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

            return mForecast.count

        }

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = mCollectionView.dequeueReusableCell(withReuseIdentifier: CVCellIdentifier, for: indexPath) as! CustomCollectionViewCell

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

    }

    func collectionView(_ collectionView: UICollectionView, layout              
      collectionViewLayout: UICollectionViewLayout, insetForSectionAt  
      section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 10, left: 8, bottom: 10, right: 8)
      }
    }

Это класс CustomCollectionViewCell:

import UIKit

class CustomCollectionViewCell: UICollectionViewCell {
    var mDayLabel: String?
    var mWeatherIcon: UIImage?
    var mTempLabel: String?

let dayTV: UILabel = {

    var label = UILabel()
    label.textAlignment = .center
    label.font = UIFont.boldSystemFont(ofSize: 12)
    label.textColor = .blue

    label.translatesAutoresizingMaskIntoConstraints = false
    return label

}()

let weatherImg: UIImageView = {

    var img = UIImageView()

    img.translatesAutoresizingMaskIntoConstraints = false
    return img

}()

let tempLabel: UILabel = {

    var label = UILabel()
    label.textAlignment = .center
    label.font = UIFont.systemFont(ofSize: 8)
    label.textColor = .blue

    label.translatesAutoresizingMaskIntoConstraints = false
    return label

}()

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

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

override func layoutSubviews() {
    super.layoutSubviews()

    if let label = mDayLabel{
        dayTV.text = label
    }
    if let image = mWeatherIcon{
        weatherImg.image = image
    }
    if let temp = mTempLabel{
        tempLabel.text = temp
    }

    setupDayTextView()
    setupWeatherImage()
    setupTempLabel()

}

private func setupDayTextView(){

    addSubview(dayTV)

    dayTV.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    dayTV.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true

}

private func setupWeatherImage(){

    addSubview(weatherImg)

    weatherImg.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    weatherImg.topAnchor.constraint(equalTo: dayTV.bottomAnchor, constant: 10).isActive = true

}

private func setupTempLabel(){

    addSubview(tempLabel)

    tempLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    tempLabel.topAnchor.constraint(equalTo: weatherImg.bottomAnchor, constant: 10).isActive = true

}
}

Конечно, у меня есть метод для заполнения массива mForecast данными, если я добавляю подпредставление, я вижу ячейку, но я знаю, что не должен этого делать для просмотра ячеек в представлении коллекции.

Я попытался посмотреть, но не смог найти, что здесь не так и почему ячейки не будут отображаться. Это то, что я получаю

enter image description here

1 Ответ

0 голосов
/ 08 ноября 2018

ОРИГИНАЛ:

После настройки делегата и источника данных вам нужно позвонить collectionView.reloadData()

ПЕРЕСМОТРЕНО:

Вы звоните fillArrayWithData, что вызывает reloadData, прежде чем вы завершите настройку источника данных collectionView и делегата. Таким образом, когда вызывается reloadData, нет источника, который устанавливает данные и загружает ячейки.

Попробуйте позвонить вашему fillArrayWithData после того, как вы завершите настройку представления вашей коллекции.

Я лично рекомендую настроить представление вашей коллекции в viewDidLoad или в наблюдателе свойства didSet collectionView:

var collectionView: UICollectionView! {
     didSet {
         collectionView.delegate = self
         collectionView.dataSource = self
     }
}

И затем я инициирую загрузку данных в моем методе viewWillAppear.

ПРИМЕР:

override func viewDidLoad() {

        super.viewDidLoad()
        view.backgroundColor = UIColor(red: 80/255, green: 135/255, blue: 179/255, alpha: 1.0)

        setupNavBar()
        self.navigationItem.searchController = mSearchBarController

        setupMainWeatherIcon()

        // This is where you are calling fillArrayWithData right now.
        // fillArrayWithData()

        mCollectionView.register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: CVCellIdentifier)
        mCollectionView.dataSource = self
        mCollectionView.delegate = self

        // This is where you should be calling fillArrayWithData
        fillArrayWithData()

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