为什么UICollectionViewCell的出口为零?


143

我在Interface Builder中创建了一个自定义UICollectionViewCell,将其上的视图绑定到该类,然后当我要使用字符串并将其设置为字符串上的标签时,tha标签的值为nil。

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

和子类的单元格:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

您使用显式“!”是否有原因?除了到处都有类型名称?似乎是多余的,尤其是在IBOutlets中。唯一可能重要的地方是将单元格作为LeftmenuCollectionViewCell出队,但不在那里。
mc01 2014年

1
如果我删除“!” 或使用“?” 在类定义中,出现编译器错误或崩溃。“!” 是绑定时的默认值。
亚诺什

ant单元格本身:<xxx.LeftMenuCollectionViewCell:0x7aa7b320; baseClass = UICollectionViewCell; 框架=(0 0; 180 50); 层= <CALayer的:0x7aa6f810 >>
亚诺什

所有网点都挂在IB上了吗?其他网点有作用吗?看不到其他明显问题,对不起。
mc01 2014年

Answers:


310

我再打self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")一次。如果您使用的是情节提要,则不想调用此功能。它将覆盖情节提要中的内容。

如果您仍然有问题请检查是否reuseIdentifier相同dequeueReusableCellWithReuseIdentifier ,并storyboard


18
谢谢!与使用自定义单元格一样,在此上花费了一个多小时。
DogCoffee 2014年

我有相同的问题,但从未使用过这一行代码,您知道为什么我会遇到相同的异常吗?
Dekel Maman 2014年

谢谢。这为我解决了。我有一个故事板,我手动添加了一个视图控制器。样板代码包括您提到的行。即使它看起来正确(正确的标识符和类),它也拒绝连接插座。现在可以了。甜!
2014年

13
如果您使用的是情节提要,则不想调用此功能。它将覆盖情节提要中的内容。<-这个真的帮了我
Sruit A.Suk 2015年

6
GAH,UICollectionViewController模板中有多么可怕的东西!谢谢,贾诺斯。
肯尼·怀兰德

53

只需删除此行:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
我不明白为什么这被否决了。这就是我的问题的答案。
费利克斯·西蒙斯

1
这是正确的答案,并应由提出问题的人进行相应的标记。也将很
高兴

3
猜猜它被否决了,是因为问题本身在14年8月才得到了回答...而这个答案只是在几个月后再次在这里复制答案。
Nitin Nain

1
但是,当我不使用它时,它会在-[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:]中出现错误断言失败– Shaheera,2016
6

欢迎解释为什么不需要此行。当前由Xcode样板添加,以用于新的集合视图。
pkamb

47

如果使用的是xib,请确保已将此行代码添加到viewdidload中。

目标C:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

迅速:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")

您必须同时注册class和nib,还是仅nib就足够了?
RainCast

3
我刚刚注册了笔尖,它解决了我的问题。
阿米莉亚

似乎有两种注册方式,而我使用的是错误的方式... collectionView?.register(UINib(nibName:“ YourItemClassName”,bundle:nil),forCellWithReuseIdentifier:“ yourIdentifier”)collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier:“ yourIdentifier”)
塞尔吉奥

17

要注册那个笔尖的家伙!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")

6

好像有两种注册方式,而我第一次使用的是错误的方式。我有一个自定义的xib视图,因此已向第二个选项注册,并且我们有数据!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

我有一个类似的问题,但是我的错误是我没有委托CollectionViewCell能够更改标签文本。


0

我认为,最好的解决办法是直接从故事板使用,其中添加CollectionView,在替代你需要删除CollectionViewCellCollectionView在故事板并注册使用以下命令细胞:

collectionView?.register(UINib(nibName:“ YourItemClassName”,捆绑包:nil),forCellWithReuseIdentifier:“ yourIdentifier”)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.