Pourquoi la sortie d'UICollectionViewCell est-elle nulle?

143

J'ai créé un UICollectionViewCell personnalisé dans Interface Builder, lié des vues dessus à la classe, puis quand je veux utiliser et définir une chaîne sur l'étiquette de la chaîne, l'étiquette a une valeur nulle.

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
}

Et la cellule sous-classée:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}
János
la source
Y a-t-il une raison pour laquelle vous utilisez l'explicite "!" en plus des noms de type partout? Semble redondant, surtout dans les IBOutlets. Le seul endroit où cela peut avoir de l'importance est l'endroit où vous retirez la cellule en tant que LeftmenuCollectionViewCell, mais vous ne le faites pas là-bas. Pouvez-vous imprimer ou NSLog «cellule» elle-même?
mc01
1
Si je supprime "!" Ou utiliser "?" dans la définition de classe, j'obtiens une erreur ou un crash du compilateur. "!" est la valeur par défaut lorsque vous la liez.
János
et la cellule elle-même: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; cadre = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János
Tous les points de vente connectés à IB? Les autres points de vente fonctionnent-ils? Je ne vois aucun autre problème évident, désolé.
mc01

Réponses:

310

J'appelle à self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")nouveau. Si vous utilisez un storyboard, vous ne voulez pas l'appeler . Il écrasera ce que vous avez dans votre storyboard.

Si le problème persiste, vérifiez s'il reuseIdentifiers'agit de la même chose dans dequeueReusableCellWithReuseIdentifier et dans storyboard.

János
la source
18
Je vous remercie! J'ai passé plus d'une heure là-dessus, tout comme l'utilisation d'une cellule personnalisée.
DogCoffee
J'ai le même problème mais je n'ai jamais utilisé cette ligne de code, vous savez pourquoi j'obtiens la même exception?
Dekel Maman
Merci. cela l'a résolu pour moi. j'avais un storyboard et j'ai ajouté manuellement un contrôleur de vue. le code passe-partout comprenait la ligne que vous avez mentionnée. même si cela semblait correct (identifiant et classe corrects), il a refusé de connecter les prises. maintenant ça marche. doux!
Joris Weimar
13
Si vous utilisez un storyboard, vous ne voulez pas l'appeler. Il écrasera ce que vous avez dans votre storyboard. <- Celui-ci m'aide vraiment
Sruit A.Suk
6
GAH, quelle horrible chose à avoir dans le modèle UICollectionViewController !!!!! Merci, Janos.
Kenny Wyland
53

Supprimez simplement cette ligne:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
能 蟹 仔
la source
3
Je ne comprends pas pourquoi ce vote a été rejeté. C'était la réponse à mon problème.
Félix Simões
1
C'est la bonne réponse et doit être marquée en conséquence par la personne qui a posé la question. Ce serait également formidable de comprendre pourquoi cela fonctionne :)
Kiko Lobo
3
Je suppose que le vote a été défavorable car la question a reçu une réponse en août 14 lui-même ... alors que cette réponse ne fait que copier à nouveau la réponse ici, après plusieurs mois.
Nitin Nain
1
Mais quand je ne l'utilise pas, cela me donne un échec d'assertion d'erreur dans - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera
Une explication de la raison pour laquelle cette ligne n'est pas nécessaire serait la bienvenue. Il est actuellement ajouté par le passe-partout Xcode pour une nouvelle vue de collection.
pkamb
47

Si vous utilisez xib, assurez-vous que vous avez ajouté cette ligne de code à votre viewdidload.

Objectif c:

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

Rapide:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")
Vineeth
la source
devez-vous enregistrer à la fois la classe et la plume, ou seule la plume suffit?
RainCast
3
Je viens d'enregistrer la plume et cela a résolu mes problèmes.
Amelia
Il semble qu'il y ait deux façons de m'enregistrer et que j'utilisais la mauvaise ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio
17

Je dois enregistrer cette plume les gars!

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

On dirait qu'il y a deux façons de s'inscrire et que j'utilisais la mauvaise la première. J'ai une vue xib personnalisée donc enregistrée avec la deuxième option, et nous avons des données!

1:

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

2:

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

J'ai eu un problème similaire, mais mon erreur est que je n'ai pas délégué CollectionViewCell pour pouvoir modifier le texte de l'étiquette.

justRadojko
la source
0

Je pense que la meilleure solution est d'utiliser directement à partir du storyboard où ajouter un CollectionView, en alternative, vous devez supprimer un CollectionViewCellde votre CollectionViewstoryboard et enregistrer une cellule avec la commande suivante:

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

dgalluccio
la source