Unable to Dequeue viewForSupplementaryElementOfKind '未检索到返回的视图'
Posted
技术标签:
【中文标题】Unable to Dequeue viewForSupplementaryElementOfKind \'未检索到返回的视图\'【英文标题】:Unable to Dequeue viewForSupplementaryElementOfKind 'the view returned was not retrieved'Unable to Dequeue viewForSupplementaryElementOfKind '未检索到返回的视图' 【发布时间】:2020-05-10 16:05:54 【问题描述】:我有一个 collectionView
有 2 个部分。但是,我正在尝试dequeueReusableSupplementaryView
。我收到以下错误:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“视图返回自 -collectionView:viewForSupplementaryElementOfKind:atIndexPath (UICollectionElementKindSectionFooter, length = 2, path = 1 - 0) 未被检索到 打电话 -dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: 或为零
这是我的代码:
enum HomeSection: Int, CaseIterable
case companies = 0, reviews
private var sections = [HomeSection]()
override func viewDidLoad()
super.viewDidLoad()
sections = [.companies, .reviews]
setUpView()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let companyCell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifier.companyCell, for: indexPath) as! CompanyCell
let reviewCell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifier.reviewCell, for: indexPath) as! ReviewCell
switch sections[indexPath.section]
case .companies:
let company = self.companies[indexPath.item]
companyCell.company = company
return companyCell
case .reviews:
let review = self.reviews[indexPath.item]
reviewCell.review = review
return reviewCell
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
switch sections[indexPath.section]
case .companies:
switch kind
case UICollectionView.elementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: Identifier.headerView, for: indexPath) as! HeaderView
return headerView
case UICollectionView.elementKindSectionFooter:
let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: Identifier.footerView, for: indexPath) as! FooterView
return footerView
default:
return UICollectionReusableView()
case .reviews:
switch kind
case UICollectionView.elementKindSectionHeader:
return UICollectionReusableView()
case UICollectionView.elementKindSectionFooter:
return UICollectionReusableView()
default:
return UICollectionReusableView()
我已确保我已注册所有单元格和补充视图。
注册的单元格、页眉和页脚
private let collectionView: UICollectionView =
let layout = UICollectionViewFlowLayout()
layout.sectionHeadersPinToVisibleBounds = true
let view = UICollectionView(frame: .zero, collectionViewLayout: layout)
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .white
view.alwaysBounceVertical = true
view.register(CompanyCell.self,
forCellWithReuseIdentifier: Identifier.companyCell)
view.register(ReviewCell.self,
forCellWithReuseIdentifier: Identifier.reviewCell)
view.register(HeaderView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: Identifier.headerView)
view.register(FooterView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter,
withReuseIdentifier: Identifier.footerView)
return view
()
【问题讨论】:
您能显示您注册为 supp 的单元格以及如何注册它们 我已经用注册的单元格、页眉和页脚更新了问题 你是通过编程还是 xib 创建它们? 全部以编程方式。他们目前只持有一个 UILabel,当然还有所需的初始化程序。问题似乎出在 IndexPath 上,但是我相信我已经正确切换了这些部分? 【参考方案1】:错误消息告诉您,您正在返回的视图 (a) 不是由 dequeueReusableSupplementaryViewOfKind
返回的;或 (b) 是nil
。从错误信息来看,第二部分的UICollectionElementKindSectionFooter
似乎有问题。
您在很多地方都返回UICollectionReusableView()
。这是无效的,将导致此错误。您必须返回一个实际出队的补充视图(或配置您的集合视图,以便不会为该部分类型调用 viewForSupplementaryElementOfKind
)。
【讨论】:
如果视图应该返回 nil,则通过添加 assert(false, "Unexpected element kind") 解决了这个问题。 据我所知,asserts
仅适用于调试,不适用于发布版本。
是的。因此,您仍然必须返回虚拟值,否则编译器会抱怨。我个人使用fatalError
,编译器知道执行无法继续,并将在此基础上验证您的代码(例如,不仅让您免于返回一些虚拟值,甚至警告您不要输入无法访问的代码。@987654328 @ 是另一种选择。【参考方案2】:
如果你不使用 UICollectionViewController 必须调用 init()
内的寄存器或者如果你在 UIViewController 中创建一个 collectionView,你必须将 collectionView 声明为 lazy var 而不是 let
示例
private let headerIdentifer = "Cell"
private let reuseIdentifer = "Header"
private lazy var collectionView: UICollectionView =
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.delegate = self
cv.dataSource = self
cv.register(CellView.self, forCellWithReuseIdentifier: reuseIdentifer)
cv.register(HeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerIdentifer)
cv.backgroundColor = .clear
cv.showsVerticalScrollIndicator = false
return cv
()
【讨论】:
以上是关于Unable to Dequeue viewForSupplementaryElementOfKind '未检索到返回的视图'的主要内容,如果未能解决你的问题,请参考以下文章
Nacos 启动报错 Unable to start web server……Unable to start embedded Tomcat
idea 不能创建类啥原因 unable to parse template class
unable to inject dll into target怎么解决?
出现unable to open the service tomcat怎么办
unable to access jarfile baksmali.jar 怎么办
tomcat报错-----》Unable to open debugger port IDEA Unable to open debugger port