なぜUICollectionViewCellのアウトレットはnilなのですか?


143

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の「セル」自体を使用できますか?
mc01 14

1
「!」を削除すると または「?」を使用します クラス定義で、コンパイラエラーまたはクラッシュが発生します。「!」バインドするときのデフォルトです。
ヤーノシュ

antセル自体:<xxx.LeftMenuCollectionViewCell:0x7aa7b320; baseClass = UICollectionViewCell; フレーム=(0 0; 180 50); 層= <CALayerの:0x7aa6f810 >>
ヤーノシュ

すべてのアウトレットがIBに接続されていますか?他のコンセントは機能しますか?他の明らかな問題は表示されません。
mc01 14

回答:


310

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")また電話します。ストーリーボードを使用している場合は、これを呼び出す必要はありません。ストーリーボードにあるものを上書きします。

それでも問題が解決しない場合reuseIdentifierは、同じかどうかを確認してください。dequeueReusableCellWithReuseIdentifier storyboard


18
ありがとうございました!カスタムセルを使用していた場合と同様に、これに1時間以上費やしました。
DogCoffee 2014

私は同じ問題を抱えていますが、このコード行を使用したことがありません。なぜ同じ例外が発生するのでしょうか。
Dekel Maman 2014

ありがとう。これで解決しました。ストーリーボードがあり、手動でビューコントローラーを追加しました。ボイラープレートコードには、あなたが言及した行が含まれていました。正しいように見えましたが(正しい識別子とクラス)、コンセントの接続を拒否しました。今では動作します。甘い!
Joris Weimar

13
ストーリーボードを使用している場合は、これを呼び出す必要はありません。ストーリーボードにあるものを上書きします。<-これは本当に私を助けてくれます
Sruit A.Suk 2015年

6
GAH、UICollectionViewControllerテンプレートにどれほど恐ろしいものがあるか!!!!!! ありがとう、Janos。
ケニーワイランド

53

この行を削除してください:

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

3
これがなぜ反対票だったのか理解できません。これが私の問題の答えでした。
フェリックスSimões

1
これは正解であり、質問者が適宜マークする必要があります。それが機能する理由を理解するのも素晴らしいでしょう:)
Kiko Lobo '19年

3
質問は14年8月自体に回答されたため、反対票が投じられたと思います。この回答は、数か月後、ここにもう一度回答をコピーしたものです。
Nitin Nain 2016年

1
しかし、それを使用しないと、-[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:]でエラーアサーションエラーが発生します
Shaheera

この行が不要な理由の説明は歓迎されます。これは現在、新しいコレクションビューのXcodeボイラープレートによって追加されています。
pkamb 2018

47

xibを使用している場合は、このコード行をviewdidloadに追加したことを確認してください。

目標C:

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

迅速:

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

クラスとペン先の両方を登録する必要がありますか、それともペン先のみで十分ですか?
RainCast

3
ペン先を登録したところ、問題が解決しました。
Amelia

登録する方法が2つあり、間違った方法を使用していたようです... 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

登録には2つの方法があるようですが、最初に間違った方法を使用していました。2番目のオプションで登録されたカスタムxibビューがあり、データがあります!

1:

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

2:

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

0

同様の問題がありましたが、ラベルのテキストを変更できるようにCollectionViewCellを委任しなかったのが私の間違いでした。


0

最良の解決策は、ストーリーボードから直接を使用してを追加するCollectionViewことです。代わりに、ストーリーボードCollectionViewCellからを削除CollectionViewして、次のコマンドでセルを登録する必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.