Je dois ajouter des images dans mes messages du coup je me suis dit que c'était l'occasion de tester via le storyboard, j'ai créé une nouvelle cellule (identifier : Cell_image) qui utilise la classe ChatLogMessageSortantImageCollectionViewCell
class ChatLogMessageSortantImageCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var ImageView: UIImageView! @IBOutlet weak var messageLabel: UILabel!
}
Elle contient une image et un label.
Dans ma classe DiscussionsCollectionViewController, j'ai ça :
// Si il y a une image
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell_image", for: indexPath) as? ChatLogMessageSortantImageCollectionViewCell{
cell.messageLabel.text = Message // ERREUR ICI
... // la suite du code est pour changer l'image aussi mais j'ai la même erreur
}
}
Et je me retrouve donc avec une erreur : fatal error: unexpectedly found nil while unwrapping an Optional value
Ma variable "Message" est bien rempli, je l'affiche bien dans ma console donc le soucis ne vient pas de là .
Dans le debugger, je regarde dans cell >> ImageView et j'ai nil
Je pense que le soucis vient de là mais je n'arrive pas à comprendre pourquoi..
Où est ce que j'ai oublié un truc ?
De ce que je comprends, pour moi il sait bien qu'il doit utiliser la cellule de la classe ChatLogMessageSortantImageCollectionViewCell
Donc il a accès à ces "éléments" (l'image et le label), en plus il me les propose dans l'auto-complétion, du coup je ne comprends pas pourquoi il ne le retrouve pas quand il passe dedans
- Une qui utilise ChatLogMessageCollectionViewCell pour créer les bulles + message (identifiant : "Cell")
- Une qui utilise ChatLogMessageSortantImageCollectionViewCell pour créer les bulles + message + image (identifiant : "Cell_image")
Dans ma fonction, je fais le test pour savoir si il y a une image, si c'est le cas, j'utilise la cellule avec image, si il n'y en a pas, j'utilise la cellule sans image..
4/ Du coup, c'est ChatLogMessageSortantImageCollectionViewCell que je dois utiliser comme classe et oui, c'est celle qui est utilisée sur ma cellule avec image
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as UICollectionViewCell? else
{
fatalError("could not find cell")
}
switch cell
{
case let testCell as TestCell:
testCell.messageLabel.text = "normal"
case let testImageCell as TestImageCell:
testImageCell.messageLabel.text = "image"
testImageCell.imageView.image = nil
default:
break
}
J'ai refais un projet pour tester ton code.. ça fonctionne bien, pas de soucis.
J'ai comparé avec mon code et j'ai pourtant la même chose.. mais ma variable "messageLabel" est à nil dans le debugger, comme si il faisait pas le lien.. qu'il ne retrouvait pas la cellule via son identifiant
Bon bah j'ai supprimé la cellule et les outlets, j'ai recréer la cellule, changé tout les noms des outlets en les re-créant, changé l'identifiant de la cellule aussi et là j'ai plus l'erreur ^^
J'sais pas vraiment ce qu'il s'est passé pour que ça fonctionne mais bon.. Xcode s'est peut être emmêlé les pinceaux à un moment donné
Réponses
Oups ! Je voulais dire awakeFromNib
Je reviens sur ça..
Je dois ajouter des images dans mes messages du coup je me suis dit que c'était l'occasion de tester via le storyboard, j'ai créé une nouvelle cellule (identifier : Cell_image) qui utilise la classe ChatLogMessageSortantImageCollectionViewCell
Elle contient une image et un label.
Dans ma classe DiscussionsCollectionViewController, j'ai ça :
Et je me retrouve donc avec une erreur : fatal error: unexpectedly found nil while unwrapping an Optional value
Ma variable "Message" est bien rempli, je l'affiche bien dans ma console donc le soucis ne vient pas de là .
Dans le debugger, je regarde dans cell >> ImageView et j'ai nil
Je pense que le soucis vient de là mais je n'arrive pas à comprendre pourquoi..
Où est ce que j'ai oublié un truc ?
De ce que je comprends, pour moi il sait bien qu'il doit utiliser la cellule de la classe ChatLogMessageSortantImageCollectionViewCell
Donc il a accès à ces "éléments" (l'image et le label), en plus il me les propose dans l'auto-complétion, du coup je ne comprends pas pourquoi il ne le retrouve pas quand il passe dedans
Dans le storyboard, tu as lié le messageLabel et/ou ImageView avec la classe côté code (IBOulet) ?
Oui oui, ils sont reliés dans la classe ChatLogMessageSortantImageCollectionViewCell
Il y a une bulle noire à gauche de l'IBOutlet dans le code ?
Oui
En testant si la cellule se créée bien, je me rend compte que non..
il n'y a pas un truc qui peut me dire pourquoi ma cellule ne se créée pas ?
1. T'as créé un UIViewController dans un storyboard ?
2. Tu l'as désigné la classe DiscussionCollectionViewController ?
3. T'as créé la cellule dans la CollectionView ?
4. Tu l'as désigné la classe ChatLogMessageCollectionViewCell ?
5. Tu l'as désigné l'identifiant Cell_image ?
1/ Oui
2/ Oui
3/ Dans ma CollectionView, j'ai 2 cellules :
- Une qui utilise ChatLogMessageCollectionViewCell pour créer les bulles + message (identifiant : "Cell")
- Une qui utilise ChatLogMessageSortantImageCollectionViewCell pour créer les bulles + message + image (identifiant : "Cell_image")
Dans ma fonction, je fais le test pour savoir si il y a une image, si c'est le cas, j'utilise la cellule avec image, si il n'y en a pas, j'utilise la cellule sans image..
4/ Du coup, c'est ChatLogMessageSortantImageCollectionViewCell que je dois utiliser comme classe et oui, c'est celle qui est utilisée sur ma cellule avec image
5/ Oui
Tu appelles collectionView.register(...) pour les classes de cellules ?
Si oui, il ne faut pas le faire car les cellules sont déjà enregistrées à cause de leurs placement dans la CollectionView.
Tu peux nous montrer un capture d'écran pour une des cellules dans la vue, avec l'inspecteur qui affiche ses propriétés ?
Si j'enleve :
Alors je me retrouve avec l'erreur :
de ma classe ChatLogMessageSortantImageCollectionViewCell :
Captures d'écrans :
Tu n'as pas nous montré l'Identity Inspector (prochain à gauche de l'Attributes Inspector) pour la cellule.
Bah c'est pas mon 2eme screen ?
Oups ! Tu vends les lunettes ? 8--)
Voici mon code :
Et, côté cellules, c'est tout ce qu'il faut.
Mais je viens de noter que tu as :
... dans ta classe cellule. Tu n'as pas besoin de ni l'une ni l'autre de ces méthodes.
Ou, pour deux types de cellules différents :
Et, pour le storyboard :
J'ai refais un projet pour tester ton code.. ça fonctionne bien, pas de soucis.
J'ai comparé avec mon code et j'ai pourtant la même chose.. mais ma variable "messageLabel" est à nil dans le debugger, comme si il faisait pas le lien.. qu'il ne retrouvait pas la cellule via son identifiant
Mon conseil, c'est de revisiter le storyboard et revérifier que tous les outlets sont bien liés.
Ctrl-click sur chaque label, imageView, etc et là tu trouveras la liste des connexions.
Bon bah j'ai supprimé la cellule et les outlets, j'ai recréer la cellule, changé tout les noms des outlets en les re-créant, changé l'identifiant de la cellule aussi et là j'ai plus l'erreur ^^
J'sais pas vraiment ce qu'il s'est passé pour que ça fonctionne mais bon.. Xcode s'est peut être emmêlé les pinceaux à un moment donné
Merci de ta patience Joanna
De rien. Avec plusieurs ans d'expérience de Xcode, rien ne m'étonnerait pas.
Mais, attention lorsque tu travail avec les storyboards ; c'est très/trop facile à taper/supprimer qqch. inattendu.