为什么UICollectionViewCell的插座为空?

156
我在Interface Builder中创建了一个自定义的UICollectionViewCell,将其上的视图绑定到类上,但当我想要使用并将字符串设置到标签时,该标签的值为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取消队列时,但你并没有在那里这样做。你能println或NSLog单独的 'cell' 吗? - mc01
1
如果我在类定义中删除 "!" 或使用 "?",则会导致编译器错误或崩溃。 "!" 是绑定时的默认值。 - János
这是cell本身的信息:<xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; frame = (0 0; 180 50); layer = <CALayer: 0x7aa6f810>>。 - János
所有插座都连接好了吗?其他插座能用吗?我没有看到其他明显的问题,抱歉。 - mc01
设置集合视图的基本示例 - Suragch
8个回答

339

我正在再次调用self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")如果您正在使用故事板,则不需要调用此方法。它将覆盖您在故事板中的内容。

如果您仍然遇到问题,请检查dequeueReusableCellWithReuseIdentifier中的reuseIdentifier和故事板中的reuseIdentifier是否相同


21
谢谢!由于使用了自定义单元格,所以我花了一个多小时来完成这个。 - DogCoffee
我也遇到了同样的问题,但从未使用过这行代码,你有任何想法为什么我会得到相同的异常吗? - Dekel Maman
14
如果你正在使用故事板(Storyboard),就不需要调用这个。它会覆盖你在故事板中设定的内容。 - Sruit A.Suk
哈哈,我刚刚搜索了一下,发现我之前已经给这个答案点过赞了,只是不记得是什么时候了。 - bugloaf
6
哎呀,UICollectionViewController 模板中竟然有这么可怕的东西!!!谢谢,Janos。 - Kenny Wyland
显示剩余9条评论

58

只需要删除这行:

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

3
我不明白为什么这个回答被踩了。这个回答解决了我的问题。 - Félix Simões
1
这是正确的答案,应该由提问者标记为正确。了解它为什么有效也会很棒 :) - Kiko Lobo
4
猜测这个问题之所以被踩是因为它在2014年8月就已经得到了回答...而这个答案只是复制了几个月前的答案。我猜测这是导致它被踩的原因。 - Nitin Nain
1
但是当我不使用它时,它会给出错误。-[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] 中的断言失败。 - Shaheera
欢迎解释为什么不需要这行代码。目前,这行代码是由Xcode样板代码添加到新的集合视图中的。 - pkamb

57
如果您正在使用xib,请确保已将此行代码添加到您的viewdidload中。
Objective-C:
[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Swift:

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

你需要同时注册类和Nib文件吗,还是只需注册Nib文件即可? - RainCast
3
我刚刚注册了笔尖,问题得到了解决。 - Amelia
1
看起来有两种注册方式,我使用了错误的方式... collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") - Sergio
将单元格注册错误地处理了...在这个糟糕的小错误上浪费了我一半的生命... - Wahab Khan Jadon

17

大家一定要注册那个笔尖哦!

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

15

看起来有两种注册的方式,我第一次使用了错误的方式。 我有一个自定义的 xib 视图,所以使用了第二个选项进行注册,现在我们有数据啦!

1:

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

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

-1

我认为最好的解决方案是直接从Storyboard中添加CollectionView,或者你需要在Storyboard中删除CollectionView中的CollectionViewCell并使用以下命令注册单元格:

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


-1

我曾经遇到过类似的问题,但我的错误在于我没有委托CollectionViewCell来更改标签文本。


-1
你没有注册您的手机。
fileprivate let yourIdentifier = ""yourIdentifier"
super.viewDidLoad() { 

//在这里你需要注册单元格 collectionView?.register(NameOfYourClass.self, forCellWithReuseIdentifier: "yourIdentifier") }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接