Представления коллекции не могут получить текст из метки

#ios #swift #uicollectionview

#iOS #swift #uicollectionview

Вопрос:

Я создал два представления коллекции в одном контроллере представления. По неизвестной причине я не могу получить текст из UILabel для второго представления коллекции.

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

Мой код:

 class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate  {

    @IBOutlet weak var mainNumbers: UICollectionView!
    @IBOutlet weak var horizontalNumbers: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        mainNumbers.delegate = self
        mainNumbers.dataSource = self

        horizontalNumbers.delegate = self
        horizontalNumbers.dataSource = self
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if collectionView == mainNumbers {
           return 81
        } else {
           return 5
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if collectionView == mainNumbers {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MainCell
            cell.label.text = "f"
            cell.backgroundColor = .systemGreen
            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell2", for: indexPath) as! CellSecond
            cell.cellSecond.text = "fds"
            cell.backgroundColor = .systemGreen
            return cell
        }



    }

}
  

Для второй метки представления коллекции ничего не отображается. Я не могу понять причину, почему.

 class MainCell: UICollectionViewCell {
    
    @IBOutlet weak var label: UILabel!
}

class CellSecond: UICollectionViewCell {
    
    @IBOutlet weak var cellSecond: UILabel!
}
  

введите описание изображения здесь

Комментарии:

1. попробуйте проверить, cellSecond связано ли это с выходом, используйте правильное определение имен для collectionView , например, измените имя первого CollectionView и cellForItemAt только требуйте if..else

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

3. цвет фона ячейки отображается правильно? и можете ли вы показать свой вывод?

4. ДА. Я добавил скриншот к своему вопросу.

5. Попробуйте отключить outlet для cellSecond и подключить его снова и убедитесь, что у него те же свойства, что и у первого CollectionView label

Ответ №1:

Первое, что нужно: нет необходимости создавать два разных класса. Создайте только один такой:

 class MyCollectionViewCell: UICollectionViewCell {
let label: UILabel = {
       let lab = UILabel()
        lab.translatesAutoresizingMaskIntoConstraints = false
        lab.contentMode =  .scaleAspectFit
        lab.font = UIFont.systemFont(ofSize: 15)
        lab.clipsToBounds = true
        lab.numberOfLines = 3
        
        return lab
    }()

        override init(frame: CGRect) {
            super.init(frame: .zero)
            
            contentView.addSubview(label)

            label.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
            label.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
            label.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
            label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
   }
}
  

Теперь зарегистрируйте обе ячейки так, как вы это делали, но назначьте им обоим MyCollectionViewCell и вызовите cell.label.text = "whateverYouWant" .