Neden UICollectionViewCell'in çıkışı sıfır?


143

Arabirim Oluşturucu'da özel bir UICollectionViewCell oluşturduk, görünümleri sınıfa bağladım ve sonra kullanmak ve dizede etikete bir dize ayarlamak istediğinizde, tha etiketi nil değerine sahiptir.

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
}

Ve alt sınıf hücre:

class LeftMenuCollectionViewCell: UICollectionViewCell {

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

Açık "!" Kullanmanız için bir neden var mı? her yerde isimleri yazmak için ek olarak? IBOutlets'de gereksiz, özellikle görünüyor. Önemli olabileceği tek yer, hücreyi LeftmenuCollectionViewCell olarak dequeue ettiğiniz yerdir, ancak orada yapmazsınız.
mc01

1
"!" veya kullan "?" sınıf tanımı, derleyici hata veya çökme olsun. "!" bağladığınızda varsayılan değerdir.
János

ve hücrenin kendisi: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; çerçeve = (0 0; 180 50); katman = <CALayer: 0x7aa6f810 >>
János

Tüm prizler IB'de mi bağlandı? Diğer prizler çalışıyor mu? Başka bariz sorun görmüyorum, üzgünüm.
mc01

Yanıtlar:


310

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")Tekrar arıyorum . Bir storyboard kullanıyorsanız, bunu aramak istemezsiniz . Film şeridinizde olanların üzerine yazacaktır.

Hala Hava sorun çek varsa reuseIdentifierolduğunu aynı yer dequeueReusableCellWithReuseIdentifier ve içinde storyboard.


18
Teşekkür ederim! Özel bir hücre kullanıyor gibi bu bir saatten fazla harcadı.
DogCoffee

i aynı sorunu var ama asla bu kod satırı kullanılmış, neden aynı istisna olsun herhangi bir fikrin var mı?
Dekel Maman

Teşekkürler. bu benim için çözdü. bir storyboard vardı ve manuel olarak bir görünüm denetleyicisi ekledi. ısıtıcı plaka kodu, bahsettiğiniz satırı içeriyordu. doğru görünse bile (doğru tanımlayıcı ve sınıf) çıkışları bağlamayı reddetti. şimdi çalışıyor. tatlı!
Joris Weimar

13
Bir storyboard kullanıyorsanız, bunu aramak istemezsiniz. Film şeridinizde olanların üzerine yazacaktır. <- Bu gerçekten bana yardım et
Sruit A.Suk

6
GAH, UICollectionViewController şablonunda ne korkunç bir şey var !!!!! Teşekkürler, Janos.
Kenny Wyland

53

Bu satırı kaldırmanız yeterlidir:

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

3
Bunun neden oy kullanıldığını anlamıyorum. Sorunumun cevabı buydu.
Félix Simões

1
Bu doğru cevaptır ve soruyu soran kişi tarafından işaretlenmelidir. Ayrıca neden işe yaradığını anlamak harika olurdu :)
Kiko Lobo

3
Sanırım bu soru ağustos 14'te cevaplandı, çünkü bu cevap birkaç ay sonra cevabı tekrar kopyaladı.
Nitin Nain

1
Ama ben kullanmadığımda, - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
11

Bu hattın neden gerekli olmadığına dair bir açıklama memnuniyetle karşılanacaktır. Şu anda yeni bir koleksiyon görünümü için Xcode kaynak plakası tarafından eklenmiştir.
pkamb

47

Xib kullanıyorsanız, bu kod satırını viewdidload'unuza eklediğinizden emin olun.

Hedef C:

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

Swift:

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

hem sınıfı hem de ucu kaydetmeniz mi gerekiyor, yoksa sadece ucu yeterli mi?
RainCast

3
Yeni ucu kaydettim ve sorunlarımı çözdü.
Amelia

Kayıt olmanın iki yolu var gibi görünüyor ve yanlış olanı kullanıyordum ... collectionView? .Register (UINib (nibName: "YourItemClassName", paket: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio

17

Bu uçları kaydetmelisin!

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

6

Kayıt olmanın iki yolu var gibi görünüyor ve ilk önce yanlış olanı kullanıyordum. İkinci seçenekle kayıtlı özel bir xib görünümüm var ve verilerimiz var!

1:

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

2:

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

0

Ben de benzer bir sorun vardı, ama benim hata etiket metni değiştirmek edebilmek için CollectionViewCell delege değildi oldu ..


0

Bunun en iyi çözüm bir ekleme nerede doğrudan Storyboard'dan kullanmak olduğunu düşünüyorum CollectionViewEğer kaldırmanız gerekiyorsa alternatif de, CollectionViewCellhesabınızla ilgili CollectionViewFilm şeridinde ve şu komutla bir hücreyi kayıt:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.