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.