Perché l'outlet di UICollectionViewCell è nullo?


143

Ho creato un UICollectionViewCell personalizzato in Interface Builder, ho associato le viste su di esso alla classe e quindi quando voglio usare e impostare una stringa sull'etichetta sulla stringa, l'etichetta ha un valore nullo.

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
}

E la cella sottoclasse:

class LeftMenuCollectionViewCell: UICollectionViewCell {

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

C'è un motivo per cui stai usando l'esplicito "!" oltre a digitare nomi ovunque? Sembra ridondante, specialmente nelle prese IBO. L'unico posto in cui potrebbe importare è dove si dequeue la cella come LeftmenuCollectionViewCell, ma non lo si fa lì. È possibile stampare 'n' cell 'o NSLog?
MC01,

1
Se rimuovo "!" o usa "?" nella definizione della classe, ottengo un errore del compilatore o un arresto anomalo. "!" è il valore predefinito quando lo si associa.
János,

e la cella stessa: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; frame = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János

Tutti i punti vendita collegati a IB? Gli altri punti vendita funzionano? Non vedere altri problemi ovvi, scusa.
MC01,

Risposte:


310

Sto chiamando di self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")nuovo. Se stai usando uno storyboard non vuoi chiamarlo . Sovrascriverà ciò che hai nello storyboard.

Se il problema persiste, verificare se reuseIdentifierè lo stesso dentro dequeueReusableCellWithReuseIdentifier e dentro storyboard.


18
Grazie! Ho trascorso più di un'ora su questo mentre stavo usando una cella personalizzata.
DogCoffee

ho lo stesso problema ma non ho mai usato questa riga di codice, hai idea del perché ottengo la stessa eccezione?
Dekel Maman,

Grazie. questo mi ha risolto. avevo uno storyboard e ho aggiunto manualmente un controller di visualizzazione. il codice del boilerplate includeva la riga menzionata. anche se sembrava corretto (identificatore e classe corretti) si rifiutava di collegare le prese. ora funziona. dolce!
Joris Weimar,

13
Se stai usando uno storyboard non vuoi chiamarlo. Sovrascriverà ciò che hai nello storyboard. <- Questo mi aiuta davvero
Assumi A.Suk il

6
GAH, che cosa orribile avere nel modello UICollectionViewController !!!!! Grazie Janos.
Kenny Wyland,

53

Rimuovi questa riga:

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

3
Non capisco perché sia ​​stato votato in negativo. Questa era la risposta al mio problema.
Félix Simões,

1
Questa è la risposta corretta e deve essere contrassegnata di conseguenza dalla persona che ha posto la domanda. Sarebbe anche bello capire perché funziona :)
Kiko Lobo

3
Suppongo che sia stato sottoposto a downgrade perché alla domanda è stata data risposta nell'agosto 14 stesso ... mentre questa risposta copia di nuovo la risposta qui, dopo diversi mesi.
Nitin Nain,

1
Ma quando non lo uso, mi dà errore Errore di asserzione in - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera,

Una spiegazione del perché questa linea non è necessaria sarebbe benvenuta. Attualmente è aggiunto dalla piastra di cottura Xcode per una nuova vista della raccolta.
pkamb,

47

Se stai usando xib, assicurati di aver aggiunto questa riga di codice al tuo viewdidload.

Obiettivo C:

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

Swift:

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

devi registrare sia la classe che il pennino o è sufficiente solo pennino?
RainCast,

3
Ho appena registrato il pennino e ho risolto i miei problemi.
Amelia,

Sembra che ci siano due modi per registrarsi e stavo usando quello sbagliato ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio

17

Devo registrare quel pennino ragazzi!

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

6

Sembra che ci siano due modi per registrarsi e stavo usando quello sbagliato il primo. Ho una vista xib personalizzata quindi registrata con la seconda opzione e abbiamo i dati!

1:

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

2:

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

0

Ho avuto un problema simile, ma il mio errore è stato non delegare CollectionViewCell per poter modificare il testo dell'etichetta ..


0

Penso che la migliore soluzione sia quella di utilizzare direttamente dallo storyboard in cui aggiungere un CollectionView, in alternativa è necessario rimuovere un CollectionViewCelldal proprio CollectionViewnello storyboard e registrare una cella con il seguente comando:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.