Mengapa outlet UICollectionViewCell nihil?

143

Saya telah membuat UICollectionViewCell kustom di Interface Builder, mengikat pandangan ke kelas, dan kemudian ketika saya ingin menggunakan dan mengatur string ke label pada string, label tha memiliki nilai nol.

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
}

Dan sel subkelas:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}
János
sumber
Apakah ada alasan Anda menggunakan "!" selain mengetik nama di mana saja? Tampak berlebihan, khususnya di IBOutlets. Satu-satunya tempat yang mungkin menjadi masalah adalah di mana Anda mengeluarkan sel sebagai LeftmenuCollectionViewCell, tetapi Anda tidak melakukannya di sana .. Bisakah Anda mencetak 'sel' NSLog sendiri?
mc01
1
Jika saya menghapus "!" atau gunakan "?" dalam definisi kelas, saya mendapatkan kesalahan kompilasi atau crash. "!" adalah default saat Anda mengikatnya.
János
semut sel itu sendiri: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; frame = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János
Semua outlet terhubung di IB? Apakah outlet lain berfungsi? Jangan melihat masalah nyata lainnya, maaf.
mc01

Jawaban:

310

Saya menelepon self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")lagi. Jika Anda menggunakan storyboard, Anda tidak ingin menyebutnya . Itu akan menimpa apa yang Anda miliki di storyboard Anda.

Jika Anda masih memiliki cek masalah cuaca reuseIdentifieradalah sama di dequeueReusableCellWithReuseIdentifier dan di storyboard.

János
sumber
18
Terima kasih! Menghabiskan lebih dari satu jam untuk ini seperti menggunakan sel khusus.
DogCoffee
saya memiliki masalah yang sama tetapi tidak pernah menggunakan baris kode ini, Anda tahu mengapa saya mendapatkan pengecualian yang sama?
Dekel Maman
Terima kasih. ini menyelesaikannya untuk saya. Saya punya storyboard dan saya secara manual menambahkan view controller. kode boilerplate termasuk baris yang Anda sebutkan. meskipun tampaknya benar (pengidentifikasi & kelas) ia menolak untuk menghubungkan outlet. sekarang berhasil. manis!
Joris Weimar
13
Jika Anda menggunakan storyboard, Anda tidak ingin menyebutnya. Itu akan menimpa apa yang Anda miliki di storyboard Anda. <- Yang ini benar-benar Bantu aku keluar
Sruit A.Suk
6
GAH, sungguh hal yang mengerikan untuk dimiliki dalam template UICollectionViewController !!!!! Terima kasih, Janos.
Kenny Wyland
53

Hapus saja baris ini:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
能 蟹 仔
sumber
3
Saya tidak mengerti mengapa ini tidak dipilih. Ini adalah jawaban untuk masalah saya.
Félix Simões
1
Ini adalah jawaban yang benar, dan harus ditandai oleh orang yang mengajukan pertanyaan. Akan sangat bagus untuk memahami mengapa ini bekerja :)
Kiko Lobo
3
Tebak itu dibatalkan karena pertanyaan dijawab dalam Agustus'14 itu sendiri ... sementara jawaban ini hanya menyalin jawaban lagi di sini, setelah beberapa bulan.
Nitin Nain
1
Tapi ketika saya tidak menggunakannya, itu memberi saya kesalahan Pernyataan kegagalan dalam - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera
Penjelasan mengapa baris ini tidak diperlukan akan diterima. Saat ini ditambahkan oleh boilerplate Xcode untuk tampilan koleksi baru.
pkamb
47

Jika Anda menggunakan xib, pastikan Anda telah menambahkan baris kode ini ke viewdidload Anda.

Sasaran C:

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

Cepat:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")
Vineeth
sumber
apakah Anda harus mendaftarkan kelas dan nib, atau hanya nib yang cukup?
RainCast
3
Saya baru saja mendaftar dan menyelesaikan masalah saya.
Amelia
Sepertinya ada dua cara untuk mendaftar dan saya menggunakan yang salah ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundel: nil), untukCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio
17

Harus mendaftar bahwa nib guys!

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

Sepertinya ada dua cara untuk mendaftar dan saya menggunakan yang salah dulu. Saya memiliki tampilan xib khusus sehingga terdaftar dengan opsi kedua, dan kami memiliki data!

1:

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

2:

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

Saya memiliki masalah yang sama, tetapi kesalahan saya adalah saya tidak mendelegasikan CollectionViewCell untuk dapat mengubah teks label ..

justRadojko
sumber
0

Saya pikir solusi terbaik adalah dengan langsung menggunakan dari storyboard mana menambahkan CollectionView, sebagai alternatif Anda perlu menghapus CollectionViewCelldari CollectionViewdalam storyboard Anda dan mendaftarkan sel dengan perintah berikut:

collectionView? .register (UINib (nibName: "YourItemClassName", bundel: nil), untukCellWithReuseIdentifier: "yourIdentifier")

dgalluccio
sumber