Mutualiser le code par une fonction et problème de type

 Bonsoir à  tous,


 


J'ai un story board avec 10 view et dans chacune j'utilise des CollectionView et CollectionViewCell, chacune a son controller, normal.


 


TotoCollectionViewCell, ZazaCollectionViewCell, TitiCollectionViewCell, etc...


 


Comment puis-je créer une fonction de mise en forme de ma cellule qui gère son sujet pour les 10 view sans avoir à  copier/coller 10 fois le même code... ?


 


J'ai essayé de créer une variable cell qui serve dans tous les cas mais impossible car il faut quelle soit typer/caster dans le bon type systématiquement. 


Donc j'essaie avec des If/Switch mais rien n'y fait... je m'arrache les cheveux.


 


Comment faites vous dans ces cas là  ?


 


Merci pour votre aide.


 


PS : exemples de code en PJ.


Réponses

  • Voici la fonction en question. :)



    func MiseEnFormeCell(collectionView : UICollectionView, indexPath: IndexPath, dictionnaire: String) -> UICollectionViewCell {
    /*
    switch collectionView.restorationIdentifier {
    case "Corps"? :
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! AttentionTexteCollectionViewCell
    case .none, .some(_):
    let cell = UICollectionViewCell.init()
    default :
    let cell = UICollectionViewCell.init()
    }
    */
    var cell = Any
    if (collectionView.restorationIdentifier == "Corps") {
    cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! AttentionCorpsCollectionViewCell
    } else if (collectionView.restorationIdentifier == "Texte") {
    cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! AttentionTexteCollectionViewCell
    } else {
    cell = UICollectionViewCell.init()
    }

    let items = appDictionnaires(currentDictionnaire: dictionnaire)
    let itemRawValue = items.getValueByIndex(index: indexPath.item)

    // On ajoute le texte
    cell.LabelInCell.text = itemRawValue
    cell.backgroundColor = UIColor(red: 0.848, green: 0.932, blue: 0.993, alpha: 1.0)

    // On essai de mettre une icone FontAwesome
    var icon : FontAwesome?
    do {
    icon = (try FontAwesome.fromCode(itemRawValue))
    }
    if (icon != nil) {
    cell.ImageInCell.image = UIImage.fontAwesomeIcon(name: icon!, textColor: .black , size: CGSize(width: 40, height: 40))
    cell.LabelInCell.text = ""
    } else {
    // On essai de mettre une icone "manuelle png"
    do {
    (try cell.ImageInCell.image = UIImage(named:itemRawValue) )
    if (cell.ImageInCell.image != nil) {
    cell.LabelInCell.text = ""
    }
    }
    }

    return cell
    }
  • CéroceCéroce Membre, Modérateur
    novembre 2017 modifié #3
    Si la cellule est un "prototype", tu peux créer une classe qui hérite de UICollectionViewCell.

    Sinon, l'autre solution est très simple: tu crées une classe avec cette méthode et tu instancies la classe dans chacun de tes VC. (On peut aussi utiliser une méthode statique, mais souvent, c'est à  éviter).
  • Mais tes cellules sont les mêmes à  chaque fois, j'veux dire à  part leur nom.


Connectez-vous ou Inscrivez-vous pour répondre.