Почему мой UICollectionViewCell не получает данные из UICollectionViewController? - PullRequest
1 голос
/ 25 января 2020

У меня есть UICollectionViewController с именем SwipingController, который создает TeamCell и присваивает ему teamName "Boston Celtics"

class SwipingController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.backgroundColor = .white
        collectionView?.register(TeamCell.self, forCellWithReuseIdentifier: "cellId")

        collectionView?.isPagingEnabled = true
    }

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

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

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

        cell.teamName = "Boston Celtics"

        return cell
    }

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

Однако, когда я запускаю код, teamName все еще печатается как пустая строка.

class TeamCell: UICollectionViewCell {

    var teamName: String =  ""

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

        print(teamName) //this prints nothing
    }
}

Ответы [ 5 ]

3 голосов
/ 25 января 2020

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

он помещается в ячейку, поэтому изначально он пуст.

После инициализации cell.teamName = "Boston Celtics" вызывается, фактически без эффекта

необходимо обновить имя

class TeamCell: UICollectionViewCell {

    var teamName: String =  ""

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

        print(teamName) //this prints nothing
    }

    func updateName(name : String) {
         self.testName = name

    }

}

в виде коллекции

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

        cell.updateName(name : "Boston Celtics") 

        return cell
 }
2 голосов
/ 25 января 2020

Вы просто смотрите на teamName слишком рано в процессе. К тому времени, когда cellForItemAt достигает строки cell.teamName = ..., метод init ячейки уже был вызван. Таким образом, teamName всегда будет пустым во время метода init. Но, teamName будет установлено до того, как ячейка появится в представлении.


Часто ячейки просто имеют элементы управления UIKit, такие как UILabel, и вы устанавливаете text из что, например

class TeamCell: UICollectionViewCell {
    var teamLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

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

        configure()
    }

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

    func configure() {
        addSubview(teamLabel)

        NSLayoutConstraint.activate([
            teamLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
            teamLabel.centerYAnchor.constraint(equalTo: centerYAnchor)
        ])
    }

    func update(for team: String) {
        teamLabel.text = team
    }
}

А затем

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

    cell.update(for: "Boston Celtics")

    return cell
}
2 голосов
/ 25 января 2020

Пожалуйста, попробуйте это:

class TeamCell: UICollectionViewCell {

    var teamName : String = "" {
       didSet {
           print(teamName)
       }
    }

    override func awakeFromNib() {
       super.awakeFromNib()
       //custom logic goes here

    }
}


override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

    cell.teamName = "Boston Celtics"

    return cell
}

ИЛИ

class TeamCell: UICollectionViewCell {


    override func awakeFromNib() {
       super.awakeFromNib()
       //custom logic goes here

    }

    func getTeamName(teamName : String)
    {
        print(teamName)
    }
}


override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TeamCell

    cell.getTeamName(teamName: "Boston Celtics")

    return cell
}
0 голосов
/ 25 января 2020

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

0 голосов
/ 25 января 2020

в классе TeamCell попробуйте это

var teamcell = String()

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

    if teamcell != nil {
        print(teamName)
    }
}
...