web-dev-qa-db-fra.com

les en-têtes de section tableView disparaissent SWIFT

J'ai une tableView configurée pour que, lorsqu'une cellule est touchée, elle s'agrandisse en hauteur pour révéler plus d'informations. Le tableau a 5 sections.

J'ai un bug: quand une cellule se développe, toutes les cellules d'en-tête situées en dessous de cette cellule deviennent invisibles. La console génère les éléments suivants: "[31233: 564745] aucun chemin d’index pour la cellule de tableau en cours de réutilisation"

Dans mon storyboard, j'ai 2 cellules personnalisées: "myCell" pour les cellules contenant des données et "headerCell" pour les en-têtes. 

func tableView (tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

   let thisGoal : GoalModel = goalArray[indexPath.section][indexPath.row]


    if self.currentPath != nil && self.currentPath == indexPath  {
        self.currentPath = nil
    } else {
        self.currentPath = indexPath
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

Si j'entre tableView.reloadData () entre les mises à jour de début/fin, cela fonctionne correctement, même si l'arrière-plan de l'en-tête devient noir et perd l'animation. 

J'ai tout le matériel déclaré pour les en-têtes dans: func tableView (tableView: UITableView, section viewForHeaderInSection: Int) -> UIView?

qu'est-ce que je rate? J'aimerais vraiment que la tableView ait encore des animations et conserve l'arrière-plan clearColor (). 

Merci d'avance. J'ai lu toutes les réponses à l'objectif C, mais je n'ai pas réussi à les faire fonctionner pour moi. J'apprécierais vraiment l'aide de Swift.

Je pense que le problème est le chemin sans index pour la cellule de table étant réutilisée. 

24
Mason Ballowe

J'ajouterai simplement que j'ai été dérouté pendant BEAUCOUP plus de temps que je n'aurais dû me demander pourquoi je ne pouvais pas me référer au contenuView de mon portable, alors que je pouvais très bien voir qu'il se trouvait là. Ma classe personnalisée (utilisant UITableViewCell plutôt que UITableViewHeaderFooterView) renvoie une erreur fatale à chaque fois. Par conséquent, assurez-vous que tout style personnalisé est configuré sous la classe UITableViewHeaderFooterView comme suit:

class CustomHeaderCell: UITableViewHeaderFooterView {

Vous devrez également enregistrer le resuableIdentifer comme ceci:

tableView.registerNib(UINib(nibName: "HeaderCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "CellHeader")

Puis ce méchant garçon:

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CellHeader") as! CustomHeaderCell!
    return headerCell!.contentView
}
15
David West

Étant donné que je n'ai pas encore 50 ans de réputation, je ne peux pas commenter la réponse précédente. Je m'excuse donc de l'inscrire comme autre réponse.

Le renvoi de ContentView fera fonctionner la fonction mais supprimera tout le formatage effectué sur le reuseIdentifier (headerCell)

headerCell.backgroundColor = UIColor.cyanColor()

Cela ne donnera pas une couleur cyan à votre headerCell

Pour résoudre ce problème, ajoutez simplement le ".contentView" à vos lignes de formatage 

headerCell.contentView.backgroundColor = UIColor.cyanColor()
9
Nathan Wharry

Les en-têtes de vue de table dans 2 tables ont disparu lorsque j'ai converti mon application en IOS 10 - J'ai trouvé la raison dans la documentation de l'API de développeur Apple sur les en-têtes de table. Lorsque j'ai ajouté ce qui suit, les en-têtes manquants ont réapparu!

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return 44 // where 44 is the header cell view height in my storyboard
}
5
Frans

J'ai eu le même bogue parce que je retournais une cellule en utilisant la méthode de file d'attente au lieu d'une UITableViewHeaderFooterView.

Solution:

  • Ajouter une vue en dehors de la hiérarchie des vues 
  • Définissez le type sur UITableViewHeaderFooterView
  • Personnaliser
  • Lien vers un @IBOutlet
  • En func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? retournez la prise 

Pièges courants:

N'oubliez pas de définir la taille des en-têtes N'oubliez pas de définir la sortie comme étant forte.

2
Antzi

Vous pouvez envelopper la tableviewcell dans un UIView

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

let containerView = UIView()
guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "MyHeaderView") as? MyHeaderView else { fatalError(" Failed to load MyHeaderView") }
containerView.addSubview(headerCell)
return containerView

}

0
Sonu VR