#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
и подключить его снова и убедитесь, что у него те же свойства, что и у первого CollectionViewlabel
Ответ №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"
.