2015-03-09 11 views
10

Ich habe eine statische gruppierte Tabellenansicht, die 5 Abschnitte hat (alle Abschnitte haben Kopfzeilen, keine Fußzeilen). Ich habe all das mit einem Storyboard erstellt. Nun, wie kann ich die erste/oberste UITableViewSection (einschließlich der Kopfzeile) ausblenden. Ich habe versucht, einen Zugang zum UITableViewSection machen, aber es sagt mir, dass es nicht gültig ist (nicht deklarierte Typ):Wie versteckt man UITableViewSections in Swift?

@IBOutlet var section: UITableViewSection! 

ich es auf diese Weise tat, weil ich tun vorhatte:

section.hidden = true 

Kann es nicht so gemacht werden?

Meine Delegierten und Datenquellen sind zu 100% korrekt eingerichtet.

Antwort

11

können Sie die delegierte Methode verwenden:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if(section == 0) 
    return 0.0 
} 

Wenn Sie keine Zellen in einem bestimmten Abschnitt möchten, verwenden Sie die delegierte Methode:

func numberOfRowsInSection(section: Int) -> Int { 
    if (section == 0) { 
    return 0 
    } 
    else { 
    // return the number of rows you want 
    } 
} 

EDIT (Adressierung Tim ‚s Kommentar)

Um die Syntax richtig zu machen:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if (section == 0) { 
     return 0.0 
    } 
    return UITableViewAutomaticDimension 
} 

Oder auf eine sauberere switch-case Syntax:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    switch section { 
    case 0: 
     return 0.0 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 

testete ich beide und sie arbeiten gut.

+0

Was ist, wenn das TableView statisch ist (ein paar fest codierte Zeilen, die sich voneinander unterscheiden, wie ein Einstellungsfenster)? – Josh

+0

Ab Xcode 7.3, Swift 2.2: als Alternative zu 'tableView (_: heightForHeaderInSection)' können Sie auch 'tableView (_: titleForHeaderInSection)' überschreiben und 'nil' zurückgeben, wenn Sie die Kopfzeile ausblenden möchten. Dann wird die Abschnittshöhe automatisch auf 0 eingestellt, um keinen Text anzuzeigen. – maganap

+1

Das Ausblenden der Zeilen und das Festlegen von Zeilen als Höhe 0 verursachte Probleme mit meinen Einschränkungen. Diese Antwort behebt das, nette Lösung! –

1

0,0 funktionierte nicht für mich. Ich musste das tun, damit es funktioniert.

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    switch section { 
    case 0: 
     return 0.01 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 
0

Für alle, die Abschnitte zu verstecken, weil sie ein statisches gruppierten Tableview mit einer dynamischen Anzahl von Abschnitten verwendet, kann die Lösung unter der Hilfe sein. In meinem Fall musste jeder Abschnitt mit anzuzeigenden Daten einen benutzerdefinierten Header haben. Jeder Abschnitt, der keine Daten enthielt, musste vollständig ausgeblendet werden.

Die obige Antwort war in meinem Szenario sehr hilfreich. Für diejenigen, die nicht immer wissen, welche Abschnitte hier versteckt werden müssen, ist eine Lösung für Sie, die auf dem oben genannten basiert.

In meinem Szenario habe ich bis zu 12 Einträge in einem Array, das ich in bis zu 12 Abschnitten (neben anderen Abschnitten in einer gruppierten TableView) anzeigen möchte. Wenn weniger als 12 Einträge angezeigt werden sollen, möchte ich die unnötigen Abschnitte ausblenden, indem ich ihnen 0 Höhe und 0 Zeilen gebe. Ich wollte auch den HeaderView ausblenden.

Um dies zu tun, ich habe folgendes:

  1. Ihre Tableview gemäß der ausgezeichnete Antwort einrichten @sasquatch oben gab.
  2. Überprüfen Sie in den Funktionen numberOfRowsInSection (Abschnitt: Int) und tableView (_ tableView: UITableView, heightForHeaderInSection: Int), ob die Zeilen/Höhe 0 sein sollen.

In meinem Fall war ich Abschnitt 1 unter Verwendung von - 12 für meine dynamischen Daten so I-Code verwendet, wie unten:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    //For section 0 and 13, just 1 row is ok 
    if section == 0 || section == 13 { 
     return 1 
    } 

    //For sections 1 - 12, determine if we have data to populate it, or if we should hide it 
    if section <= dynamicDataToDisplay.count { 
     return 2 
    } 

    //If it's section 1 - 12, but we don't have a corresponding data entry in dynamicDataToDisplay, then just return 0 rows 
    return 0 

} 

Der Code für die heightForHeader Funktion ist ähnlich in der Logik:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    switch section { 

    case 0: 
     return 45.0 
    case 13: 
     return UITableViewAutomaticDimension 
    default: 
     if dynamicDataToDisplay.count >= section { 
      return 25.0 
     } else { 
      return 0.0 
     } 

    } //end switch 

} 

Auch nach dem Einrichten dieser Funktionen habe ich festgestellt, dass immer noch Kopfzeilen für die Abschnitte angezeigt wurden, die ich ausblenden wollte. Ich denke, ich dachte, dass viewForHeaderInSection nicht aufgerufen würde, wenn die NummerOfRows 0 und HöheOfHeader auch 0 war, aber es wurde noch immer aufgerufen.

die folgende Hinzufügen dazu beigetragen, dass der Header nicht unnötig erstellt wurde:

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

    //set up header for dynamic data sections 
    if 1 ... 12 ~= section { 

     if tableView.numberOfRows(inSection: section) == 0 { 
      return nil 
     } 
     //Continue with the header set up for valid sections with rows to display data 

     ...... 
    } 
} 

Diese Lösung könnte jemand helfen, die immer noch einen Header wird immer trotz seiner Höhe erstellt werden und Reihen gesetzt wird auf 0

Verwandte Themen