gpt4 book ai didi

ios - 如何使用自定义 UICollectionReusableView 作为 Collection View 的部分标题?

转载 作者:行者123 更新时间:2023-12-05 01:13:01 27 4
gpt4 key购买 nike

我已经被逼疯了几个小时,因为我无法解决这个问题。

我有一个 Collection View ,它可以有不同编号的不同部分。每个项目中的项目。对于每个部分,我需要使用不同类型的部分标题。因此,为此,我将使用 UICollectionReusableView。但是我似乎无法通过 UINib 注册来成功使用 UICollectionReusableView 的自定义子类。

A crash happens when I downcast the reusable view to my subclass. Like:

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
}

}

Okay, now come to the point: The above mentioned crash doesn't happen at all if I don't downcast with as! operator. Well, if I use section header from the storyboard instead of UINib registration, there is no crash.

如果我需要多种类型的 header ,那么我不能同时使用 Storyboard方法或不使用向下转换方法,因为我需要向这些 header 提供数据。


我该怎么做才能拥有多个类型 header 以及从界面构建器构建的 View ?


我做了一个 demo project与我上面所说的。如果有人感兴趣,请检查一下。

最佳答案

一旦您在 Xib 文件中分配了正确的类和标识符,它就可以正常工作。

关于ios - 如何使用自定义 UICollectionReusableView 作为 Collection View 的部分标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61047239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com