无法在集合视图中创建单元格?

Posted

技术标签:

【中文标题】无法在集合视图中创建单元格?【英文标题】:Unable to create cell in collectionview? 【发布时间】:2017-02-10 09:43:06 【问题描述】:

我想在表格视图单元格中添加一个UICollectionView。为此,我创建了以下文件。

CollectionCell:

class CollectionCell: UICollectionViewCell 

  @IBOutlet weak var lblName: UILabel!
  @IBOutlet weak var imgCell: UIImageView!
    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    


我还创建了一个CollectionCell.xib

CollectionView.swift

class CollectionView: UIView 

  @IBOutlet weak var collectionview: UICollectionView!
  var arrItems:[String] = []
    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) 
        // Drawing code
    
    */
  func configureCollectionView()
  
      collectionview.register(CollectionCell.self, forCellWithReuseIdentifier: "CollectionCell")
      collectionview.delegate = self
      collectionview.dataSource = self
  
  func setCollectionViewDatasource(arrItems:[String])
  
    self.arrItems = arrItems
    self.collectionview.reloadData()
  
  static func initiateView()->CollectionView
  
    let nib  = UINib(nibName: "CollectionView", bundle: nil)
    let view  = nib.instantiate(withOwner: nil, options: nil)[0] as! CollectionView
    return view
  



extension CollectionView:UICollectionViewDelegate



extension CollectionView:UICollectionViewDataSource

  func numberOfSections(in collectionView: UICollectionView) -> Int 

    return 1

  

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

    return arrItems.count
  

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

    let cell:CollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! CollectionCell
    cell.lblName.text  = arrItems[indexPath.row]
    return cell
  


我还创建了 CollectionView.xib

现在,由于我想为此目的在 tableview 单元格中添加一个 collectionview,我创建了一个自定义 tableview 单元格类作为 CustomTableCell

class CustomTableCell: UITableViewCell 

    var view = CollectionView()
    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    
  override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    print("ceonstatructir init")
    // insitate a nib 
    view = CollectionView.initiateView()
    view.configureCollectionView()
    contentView.addSubview(view)
    view.setCollectionViewDatasource(arrItems: ["firest","second","thierd"])

  

  required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")
  
    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    
  func setDataSource(arrItems:[String])
  
    //view.setCollectionViewDatasource(arrItems: arrItems)

  


现在我创建了一个 mainViewController 来在 tableview 上显示数据,所以我创建了 viewcontroller.swift

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 

  @IBOutlet weak var tableview: UITableView!
  let sectionArray = ["First","Second","Third","Fourth","Fifth"]
  let collectionArray = [["First","Second","Third"],["First","Second","Third"],["First","Second","Third"],["First","Second","Third"],["First","Second","Third"]]
  override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    tableview.register(CustomTableCell.self, forCellReuseIdentifier: "TableCell")
  

  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  
  func numberOfSections(in tableView: UITableView) -> Int 

    return sectionArray.count
  
  func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 

    return sectionArray[section]
  
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 1
  
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell:CustomTableCell = tableView.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as! CustomTableCell
    return cell
  
  func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 

    let cell:CustomTableCell = cell as! CustomTableCell
    let dataSource = collectionArray[indexPath.section]
    cell.setDataSource(arrItems:dataSource)


  

现在我正在尝试在刚刚创建 tableviewcell 时将数据源发送到我的 collectionview。但是我在 collectionview 中的 cellForItemAtIndexPath 中崩溃了。我在 cellForItemAyIndexPath 中将单元格设为 nil。请告诉我有什么问题它。

【问题讨论】:

你能给我发演示吗?我会解决并回复你 我如何发送给你 我发送请检查 是的,很快就给你解决方案 请检查我的回答,按照我在回答中提到的进行更改。如果它有效,请接受并支持它 【参考方案1】:

在 Collectionview.swift 中改变这个函数

 func configureCollectionView()
   
    let nib = UINib(nibName: "CollectionCell", bundle: nil)
    collectionview.register(nib, forCellWithReuseIdentifier: "cell")

    collectionview.delegate = self
    collectionview.dataSource = self
  

在 cellforItemat 中更改这一行

let cell:CollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! CollectionCell

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionCell

【讨论】:

感谢您的帮助,但我没有看到任何创建的 collectionview 单元格 @iosGuy 只需将 self.backgroundColor = UIColor.red 写入 collectioncell,您会看到每个部分创建了 3 个不同大小的单元 您需要通过收集单元格来更改单元格标识符 您需要根据需要更改单元格大小所以,请接受我的回答,我解决了您的问题。 为什么我需要再次用笔尖制作单元格?

以上是关于无法在集合视图中创建单元格?的主要内容,如果未能解决你的问题,请参考以下文章

集合视图单元格不会改变大小

集合视图单元格不在图像视图中显示图像

无法加载集合视图单元格

AirBnb 如何创建具有不同单元格的集合视图?

以编程方式创建形状视图并在集合视图单元格上使用

集合视图,具有自定义布局,单元格在滚动时行为不端