Dla każdego, kto chce ukryć sekcje ponieważ są one za pomocą statycznego pogrupowany tableView z szeregu dynamicznych odcinków, rozwiązanie poniżej mogą być pomocne. W moim przypadku każda sekcja z danymi do wyświetlenia musiała mieć niestandardowy nagłówek. Każda sekcja, która nie ma danych, musi być w pełni ukryta.
Powyższa odpowiedź była bardzo pomocna w moim scenariuszu. Jednak dla tych, którzy nie zawsze wiedzą, które sekcje będą musiały być ukryte, jest rozwiązaniem, które można rozszerzyć na powyższe.
W moim scenariuszu mam do 12 wpisów w tablicy, które chcę wyświetlić w maksymalnie 12 sekcjach (wśród innych sekcji w zgrupowanej tableView). Jeśli istnieje mniej niż 12 wpisów do wyświetlenia, chcę ukryć niepotrzebne sekcje, nadając im 0 wysokości i 0 wierszy. Chciałem również ukryć headerView.
Aby to zrobić, zrobiłem, co następuje:
- Skonfiguruj tableView jak za doskonałą odpowiedź @sasquatch dał powyżej.
- W funkcjach numberOfRowsInSection (sekcja: Int) i tableView (_ tableView: UITableView, heightForHeaderInSection sekcja: Int), sprawdź, czy wiersze/wysokość powinny być równe 0.
W moim przypadku było stosując sekcje od 1 - 12 dla moich danych dynamicznych więc użyłem kodu jak poniżej:
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
}
Kod dla funkcji heightForHeader jest podobna w logice:
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
}
Nawet po skonfigurowaniu tych funkcji stwierdziłem, że nadal pojawiają się nagłówki sekcji, które chciałem ukryć. Sądzę, że pomyślałem, że viewForHeaderInSection nie zostanie wywołany, jeśli numberOfRows był równy 0, a heightOfHeader również 0, ale wciąż było wywoływane.
dodanie następujących pomogły zapewnienia, że nagłówek nie został niepotrzebnie stworzył:
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
......
}
}
To rozwiązanie może pomóc każdemu, kto ciągle się nagłówek tworzone pomimo swojej wysokości i wierszy jest ustawiona na 0.
Co się stanie, jeśli TableView jest statyczny (kilka zakodowanych na sztywno różnych wierszy, takich jak okno ustawień)? – Josh
Od Xcode 7.3, Swift 2.2: jako alternatywa dla 'tableView (_: heightForHeaderInSection)', możesz także zastąpić 'tableView (_: titleForHeaderInSection)' i zwrócić 'nil' kiedy chcesz ukryć nagłówek. Następnie wysokość sekcji hedera zostanie automatycznie ustawiona na 0, aby nie wyświetlać żadnego tekstu. – maganap
Ukrywanie wierszy i ustawianie wierszy jako wysokości 0 powodowało problemy z moimi ograniczeniami. Ta odpowiedź naprawiła to, fajne rozwiązanie! –