gpt4 book ai didi

ios - UICollectionView 错误 : cells must be retrieved by calling -: -dequeueReusableCellWithReuseIdentifier:forIndexPath:

转载 作者:搜寻专家 更新时间:2023-10-30 22:31:46 26 4
gpt4 key购买 nike

在我的项目中,我有多种类型的 UITableview 单元格,每个单元格都包含 UICollectionview

最初我在 UITableview 的 2 个部分加载了 2 个 tableViewcell。起初它加载正常没有任何问题。如果我滚动第一部分,它会很好地滚动,但是当我尝试滚动第二部分时,它会出现以下错误:

the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier - cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:

我有以下代码来设置流程:

    class Home: UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource{

override func viewDidLoad() {
self.tableView.register(SliderViewCell.nib, forCellReuseIdentifier: SliderViewCell.identifier)
self.tableView.register(GridViewCell.nib, forCellReuseIdentifier: GridViewCell.identifier)
self.tableView.estimatedRowHeight = 80
self.tableView.rowHeight = UITableViewAutomaticDimension

}
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

let viewObj = self.viewObject[indexPath.section]
if viewObj.itemType! == HomeViewItemType.Slider.rawValue{
if let sliderCell = cell as? SliderViewCell {
sliderCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
}
}
else if viewObj.itemType! == HomeViewItemType.Grid.rawValue{
if let gridCell = cell as? GridViewCell {
gridCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
}
}


}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if self.viewObject.count>0{
let viewObj = self.viewObject[indexPath.section]
if viewObj.itemType! == HomeViewItemType.Slider.rawValue{
let cell:SliderViewCell = tableView.dequeueReusableCell(withIdentifier: SliderViewCell.identifier, for: indexPath) as! SliderViewCell
cell.contentView.tag = indexPath.section
return cell
}
else if viewObj.itemType! == HomeViewItemType.Grid.rawValue{
let cell:GridViewCell = tableView.dequeueReusableCell(withIdentifier: GridViewCell.identifier, for: indexPath) as! GridViewCell
cell.contentView.tag = indexPath.section
return cell
}
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("selected")
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return self.viewObject[section].viewData.count

}

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

if viewObj.itemType! == HomeViewItemType.Slider.rawValue{
if let cell:SliderCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: SliderCollectionViewCell.identifier, for: indexPath) as? SliderCollectionViewCell{

if viewObj.viewData.count>0{
if let imageURL = URL(string: viewData.imageLink!){
cell.icon.sd_setImage(with: imageURL, completed: nil)
}
}
return cell
}
}
else if viewObj.itemType! == HomeViewItemType.Grid.rawValue{
if let cell:GridCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: GridCollectionViewCell.identifier, for: indexPath) as? GridCollectionViewCell{

if viewObj.viewData.count>0{
if let imageURL = URL(string: viewData.icon!){
cell.icon.sd_setImage(with: imageURL, completed: nil)
}

}

return cell
}
}

return UICollectionViewCell()
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("tapped")
}

}

class SliderViewCell: UITableViewCell {

@IBOutlet weak var collectionView: UICollectionView!
static var nib:UINib {
return UINib(nibName: identifier, bundle: nil)
}
static var identifier:String {
return String(describing: SliderViewCell.self)
}
var collectionViewCellWidth : CGFloat = 15.0
var collectionViewCellHeight : CGFloat = 150.0
var cellSpaceWidth : CGFloat = 8.0

override func awakeFromNib() {
super.awakeFromNib()
self.configureCollectionViewCell(nibFile: SliderCollectionViewCell.nib, identifier: SliderCollectionViewCell.identifier, width: collectionView.frame.size.width, height: 80, topInset: 0, leftInset: 0, bottomInset: 0, rightInset: 0, cellSpace: cellSpaceWidth, interimSpace: 0.0, scrollInDirection: .horizontal)
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}
}
class GridViewCell: UITableViewCell {

@IBOutlet weak var collectionView: UICollectionView!
static var nib:UINib {
return UINib(nibName: identifier, bundle: nil)
}
static var identifier:String {
return String(describing: GridViewCell.self)
}
var collectionViewCellWidth : CGFloat = 15.0
var collectionViewCellHeight : CGFloat = 150.0
var cellSpaceWidth : CGFloat = 8.0

override func awakeFromNib() {
super.awakeFromNib()
self.configureCollectionViewCell(nibFile: GridCollectionViewCell.nib, identifier: GridCollectionViewCell.identifier, width: collectionView.frame.size.width, height: 80, topInset: 0, leftInset: 0, bottomInset: 0, rightInset: 0, cellSpace: cellSpaceWidth, interimSpace: 0.0, scrollInDirection: .horizontal)
}

func configureCollectionViewCell(nibFile:UINib, identifier:String,width:CGFloat,height:CGFloat, topInset:CGFloat,leftInset:CGFloat,bottomInset:CGFloat,rightInset:CGFloat, cellSpace:CGFloat, interimSpace:CGFloat,scrollInDirection:UICollectionViewScrollDirection){

let nib = nibFile
collectionView.register(nib, forCellWithReuseIdentifier: identifier)
let cellWidth : CGFloat = width//collectionView.frame.size.width
let cellheight : CGFloat = height//collectionViewCellHeight
let cellSize = CGSize(width: cellWidth , height:cellheight)
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = scrollInDirection
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
layout.minimumLineSpacing = cellSpace
layout.minimumInteritemSpacing = interimSpace
collectionView.setCollectionViewLayout(layout, animated: true)
collectionView.reloadData()

}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}
}

extension GridViewCell{

func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>(_ dataSourceDelegate: D, forRow row:Int){

collectionView.delegate = dataSourceDelegate
collectionView.dataSource = dataSourceDelegate
collectionView.reloadData()

}
}

我认为在 UITableview 的第二部分加载的 GridViewCell 导致了问题。但是我已经在 collectionView:cellForItemAtIndexPath: 方法中添加了 dequeueReusableCellWithReuseIdentifier。所以我不知道是什么导致了错误。

如有任何帮助,我们将不胜感激。

最佳答案

问题可能是因为你在返回UICollectionViewCell()中

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

如果不满足这两个条件。

如果在任何时候不满足条件,您将返回一个未通过调用 dequeueReusableCellWithReuseIdentifier:forIndexPath: 检索的单元格,如异常所述。

尝试设置断点以确认这是否是实际发生的情况。

关于ios - UICollectionView 错误 : cells must be retrieved by calling -: -dequeueReusableCellWithReuseIdentifier:forIndexPath:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189066/

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