在 UICollectionView 中通过 NIB 添加自定义单元格

Posted

技术标签:

【中文标题】在 UICollectionView 中通过 NIB 添加自定义单元格【英文标题】:Adding custom cell via NIB in UICollecitonView 【发布时间】:2016-03-02 20:49:37 【问题描述】:

我有一个非常简单的 swift 程序,它使用 UICollectionView 中的 Nib 构建的自定义单元格。

当我运行应用程序时,我收到一条错误提示

:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载 NIB:”

我查看了所有教程并完全按照它们进行操作,看起来我以某种方式缺少初始化程序,但我不知所措。在故事板编辑器中 CollectionViewController 的主要默认单元格中,我将重用标识符命名为“Cell”,对于 Nib(swift 文件名为 CustomCollectionViewCell.xib),我将重用标识符命名为“CustomCell”。我在 Xib 中有一个 UIButton 作为一个动作,如果按下它应该记录成功。

这里是mainVC:

class MainCollectionViewController: UICollectionViewController 

override func viewDidLoad() 
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false


    // Register cell classes
    self.collectionView!.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "Cell")

    // Do any additional setup after loading the view.


override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 1



override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of items
    return 1


override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CustomCollectionViewCell

    // Configure the cell

    return cell


这里是 CustomCollectionViewCell 代码:

class CustomCollectionViewCell: UICollectionViewCell 

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)



@IBAction func testButton(sender: UIButton) 
    print("Success!")

我知道这是一个基本的初学者项目,但我在网络上到处查看并且很难过。任何帮助将不胜感激。

【问题讨论】:

我忘了添加我确实在上面的主 VC 中定义了 let reuseIdentifier = "Cell"。 【参考方案1】:

为什么不只使用原型单元格。将原型单元格的类更改为 CustomCollectionViewCell,在该单元格中设置您的 UI。删除:

self.collectionView!.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "Cell")

在viewDidLoad中删除CustomCollectionViewCell.xib

【讨论】:

我有这个工作,但我希望能够在集合视图中有不同的单元格,每个单元格都有自己的 UI 项(即一个可能有一个 UISwitch 另一个可能有一个 UISlider),我不除了唯一的 XIB 文件之外,我不知道该怎么做。 您可以拥有多个原型单元格,它们具有不同的单元格标识符和不同的 UICollectionViewCell 子类。 我使用多个原型单元让它工作,比使用 xib 容易得多。我还是很好奇为什么上面的代码不起作用。 我认为您的标识符错误。我相信你不需要在你的 tableview 中有任何原型单元格,然后用唯一的 id 注册你的笔尖。 就是这样!我消除了原始细胞,一切正常。

以上是关于在 UICollectionView 中通过 NIB 添加自定义单元格的主要内容,如果未能解决你的问题,请参考以下文章

在C中通过引用传递数组?

在 C++ 中通过引用传递对象

在终端中通过 Emacs 查看手册页

在 Store C# 中通过哈希查找证书

无法在 MySQLi 中通过引用传递参数 [重复]

在 Go Lang 中通过通道传递指针