使用 Swift 的 UICollectionView
Posted
技术标签:
【中文标题】使用 Swift 的 UICollectionView【英文标题】:UICollectionView Using Swift 【发布时间】:2014-06-12 05:26:31 【问题描述】:在我的项目中,我在 UICollectionViewCell 中创建了 Cell
由于未捕获的异常而终止应用程序时出错
代码如下。
GalleryCell.swift
class GalleryCell: UICollectionViewCell
@IBOutlet var titleLabel : UILabel
init(coder aDecoder: NSCoder!)
super.init(coder: aDecoder)
我在我的 ViewController 中使用了这个单元格:
代码如下:
NextViewController.swift
import UIKit
class NextViewController: UIViewController
@IBOutlet var collectionView : UICollectionView
var ListArray=NSMutableArray()
override func viewDidLoad()
super.viewDidLoad()
for i in 0..70
ListArray .addObject("C: \(i)")
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section:Int)->Int
return ListArray.count
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath:NSIndexPath)->UICollectionViewCell
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("CELL", forIndexPath: indexPath) as GalleryCell
cell.titleLabel.text="\(ListArray.objectAtIndex(indexPath.item))"
return cell
func collectionView(collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAtIndexPath indexPath:NSIndexPath) -> CGSize
return CGSizeMake(66, 58)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
我的问题是我收到以下错误:
***** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier CELL - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'*** First throw call stack:**
【问题讨论】:
【参考方案1】:我在NextViewController.swift
下viewDidLoad()
下添加了以下两行:
var nibName = UINib(nibName: "GalleryCell", bundle:nil)
collectionView.registerNib(nibName, forCellWithReuseIdentifier: "CELL")
问题是我没有注册笔尖。现在我这样做了,它工作正常。
【讨论】:
【参考方案2】:swift 中的页眉/页脚也是如此:
// register header accessory view:
self.collectionView.registerClass(UICollectionReusableView.self,
forSupplementaryViewOfKind: UICollectionElementKindSectionHeader,
withReuseIdentifier: headerReuseIdentifier);
【讨论】:
【参考方案3】:你需要注册一个单元类。
在你的viewDidLoad
写下。
collectionView.registerClass(NSClassFromString("GalleryCell"),forCellWithReuseIdentifier:"CELL");
在调用之前 dequeueReusableCellWithReuseIdentifier:forIndexPath: 方法 集合视图,您必须使用此方法或 registerNib:forCellWithReuseIdentifier: 告诉集合的方法 查看如何创建给定类型的新单元格。如果一个细胞 指定类型当前不在重用队列中,集合视图 使用提供的信息创建一个新的单元格对象 自动。
如果您之前注册了具有相同重用性的类或 nib 文件 标识符,您在 cellClass 参数中指定的类替换 旧条目。如果您愿意,可以为 cellClass 指定 nil 从指定的重用标识符中注销类。
参考registerClass:forCellWithReuseIdentifier:
【讨论】:
由于未捕获的异常“NSInternalInconsistencyException”导致应用程序出现以下错误,原因:“尝试注册不是 UICollectionViewCell ((null)) 子类的单元类” @PREMKUMAR:检查您的 GalleryCell 课程。您是否将其作为 UICollectionViewCell 的子类?问题出在日志本身 谢谢我得到答复。感谢您花费宝贵的时间。 我不得不这样说:self.collectionView.registerClass(CustomCollectionViewCell.self, forCellWithReuseIdentifier:reuseIdentifier)【参考方案4】:我想添加另一个对我有帮助的答案,以防它对其他人有用。
似乎其他人都通过使用registerNib:forCellWithReuseIdentifier:
或registerClass:forCellWithReuseIdentifier:
解决了这个问题。对我来说,有一个不同的解决方案:在我的故事板中,我选择了标题并在顶部的 Identity Inspector 中查看了我的自定义类的字段。具体来说,Module 字段为空白。我需要拉下该字段旁边的箭头并选择正确的目标。
完成此操作并保存情节提要后,上述崩溃不再发生,我可以看到我的自定义标题。
【讨论】:
以上是关于使用 Swift 的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章
ios 8.1:类型“ViewController”不符合协议“UICollectionViewDataSource”
使用 UICollectionViewFlowLayout 时在 UICollectionViewCell 的边界之外绘制
无法从 UIViewController 导航到 UICollectionViewController