web-dev-qa-db-de.com

die Header des TableView-Abschnitts verschwinden in SWIFT

Ich habe eine TableView eingerichtet, so dass beim Berühren einer Zelle die Höhe vergrößert wird, um weitere Informationen anzuzeigen. Die tableView hat 5 Abschnitte.

Ich habe einen Fehler: Wenn sich eine Zelle ausdehnt, werden alle Kopfzellen unter dieser Zelle unsichtbar. Die Konsole gibt Folgendes aus: "[31233: 564745] Kein Indexpfad für Tabellenzelle, die wiederverwendet wird"

In meinem Storyboard habe ich zwei benutzerdefinierte Zellen: "myCell" für die Daten tragenden Zellen und "headerCell" für die Header. 

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()
}

Wenn ich zwischen den Start-/End-Updates tableView.reloadData () eingebe, funktioniert es ordnungsgemäß, obwohl der Hintergrund der Kopfzeile schwarz wird und die Animation verloren geht. 

Ich habe alles für Header deklariert: func tableView (tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

was vermisse ich? Ich möchte wirklich, dass tableView immer noch Animationen enthält und der Hintergrund clearColor () bleibt. 

Danke im Voraus. Ich habe die Antworten zu Ziel C gelesen, konnte sie aber nicht dazu bringen, für mich zu arbeiten. Ich würde mich über eine schnelle Hilfe sehr freuen.

Ich denke, das Problem ist der Weg ohne Index für wiederverwendbare Tabellenzellen. 

24
Mason Ballowe

Ich habe eine Antwort in der Konsolenausgabe gefunden. Verwenden Sie diesen Code in der Header-Funktion:

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

Geben Sie nicht Ihre headerCell oder Ihre wiederverwendbare Kennung zurück. Gib den reuseIdentifier.contentView zurück. Für mich ist es: return headerCell!.contentView.

93
Mason Ballowe

Nur um hinzuzufügen, war ich für WAY länger ratlos, als ich hätte sagen sollen, warum ich mich nicht auf die Inhaltsansicht meiner Zelle beziehen konnte, als ich ganz klar sehen konnte, dass es dort war. Meine benutzerdefinierte Klasse (die UITableViewCell anstelle von UITableViewHeaderFooterView verwendet) gibt jedes Mal einen schwerwiegenden Fehler zurück. Stellen Sie daher sicher, dass ein beliebiges benutzerdefiniertes Styling unter der UITableViewHeaderFooterView-Klasse eingerichtet ist:

class CustomHeaderCell: UITableViewHeaderFooterView {

Sie müssen den resuableIdentifer auch wie folgt registrieren:

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

Dann dieser böse Junge:

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

Da ich noch nicht über 50 Jahre alt bin, kann ich die vorherige Antwort nicht kommentieren. Daher möchte ich mich dafür entschuldigen, dass ich dies als weitere Antwort aufgreife.

Durch die Rückgabe der ContentView-Funktion wird die Funktion funktionieren, aber alle Formatierungen für den reuseIdentifier (headerCell) werden gelöscht.

headerCell.backgroundColor = UIColor.cyanColor()

Dadurch wird KEINE Cyan-Farbe für Ihre headerCell bereitgestellt

Um dies zu beheben, fügen Sie einfach ".contentView" zu Ihren Formatierungszeilen hinzu 

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

Die Kopfzeilen der Tabellendarstellung in 2 Tabellen verschwanden, als ich meine App in IOS 10 konvertierte. Ich fand den Grund in der Apple-Entwickler-API-Dokumentation zu Tabellenköpfen. Wenn ich Folgendes hinzufügte, wurden die fehlenden Header erneut angezeigt.

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

Ich hatte den gleichen Fehler, weil ich eine Zelle mit der Dequeue-Methode anstelle einer UITableViewHeaderFooterView zurückgab.

Lösung:

  • Fügen Sie eine Ansicht außerhalb der Ansichtshierarchie hinzu 
  • Setze den Typ auf UITableViewHeaderFooterView
  • Anpassen
  • Link zu einem @IBOutlet
  • Stecken Sie in func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? die Steckdose zurück 

Häufige Fehler:

Vergessen Sie nicht, die Kopfgrößen einzustellen Vergessen Sie nicht, die Steckdose als stark einzustellen.

2
Antzi

Sie können die tableviewcell in eine UIView packen

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