Меня сводили с ума в течение нескольких часов, поскольку я не могу обойти эту проблему.
У меня есть представление коллекции, которое может иметь другой раздел с разными номерами. предметов в каждом. Для каждого раздела мне нужно использовать заголовок раздела разного типа. Так что для этого я собираюсь использовать UICollectionReusableView
. Но я не могу добиться успеха в использовании пользовательского подкласса UICollectionReusableView
посредством UINib
регистрации.
Cra sh происходит, когда я понижаю представление многократного использования до моего подкласса. Как:
let friendHeader = collectionView.dequeueReusableSupplementaryView(ofKind: kind,
withReuseIdentifier: "FriendHeaderView",
for: indexPath) as! FriendHeaderView
Ниже приведен фрагмент кода:
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
private let viewModel = ProfileViewModel()
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
// more code
collectionView.register(UINib(nibName: "FriendHeaderView", bundle: nil),
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: "FriendHeaderView")
}
}
Теперь вот реализация источника данных:
extension ViewController: UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
// valid implementation
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// valid implementation
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// valid implementation
}
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionView.elementKindSectionHeader:
let friendHeader = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FriendHeaderView", for: indexPath) as! FriendHeaderView
// *** Crash happens here *** //
return friendHeader
default:
assert(false, "Invalid element type")
}
}
}
И я не Не знаю, почему collectionView(_:layout:referenceSizeForHeaderInSection:)
также должен быть реализован. Итак, вот оно:
extension ViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
let size = CGSize(width: collectionView.bounds.width, height: 100)
return size
}
}
Хорошо, теперь перейдем к сути: вышеупомянутый cra sh вообще не произойдет, если я не опущу вниз с as!
оператор. Что ж, если я использую заголовок раздела из раскадровки вместо UINib
регистрации, нет никакого cra sh.
Если мне понадобится заголовок нескольких типов, то я не смогу также используйте подход раскадровки или без подхода понижения, поскольку мне нужно передать данные в эти заголовки.
Что можно сделать, чтобы иметь несколько типов заголовков с представлением, построенным из построителя интерфейса?
Я сделал демонстрационный проект с тем, что я сказал выше. Если кому-то интересно, пожалуйста, проверьте это.