2015-03-09 13 views
10

Mam statyczny zgrupowany widok tabeli, który ma 5 sekcji (wszystkie sekcje mają nagłówki, brak stopek). Stworzyłem to wszystko za pomocą Storyboard. Teraz, jak mogę ukryć pierwszy/najwyższy UITableViewSection (w tym nagłówek). Próbowałem dokonywania wylot do UITableViewSection ale to mówi mi, że nie jest ważna (typ nierejestrowanej):Jak ukryć UITableViewSections w Swift?

@IBOutlet var section: UITableViewSection! 

zrobiłem to w ten sposób, bo planowałem robić:

section.hidden = true 

można go nie robić tego w ten sposób?

Moi uczestnicy i źródła danych są skonfigurowane w 100% poprawnie.

Odpowiedz

11

Można użyć metody Delegat:

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

Jeśli chcesz bez komórek w danej sekcji, należy użyć metody Delegat:

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

EDIT (Adresowanie Tim „s komentarz)

Aby uzyskać prawidłową składnię:

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

lub do schludny składni switch-case:

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

Testowałem oba i pracują dobrze.

+0

Co się stanie, jeśli TableView jest statyczny (kilka zakodowanych na sztywno różnych wierszy, takich jak okno ustawień)? – Josh

+0

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

+1

Ukrywanie wierszy i ustawianie wierszy jako wysokości 0 powodowało problemy z moimi ograniczeniami. Ta odpowiedź naprawiła to, fajne rozwiązanie! –

1

0.0 nie działa dla mnie. Musiałem to zrobić, aby to zadziałało.

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

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

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:

  1. Skonfiguruj tableView jak za doskonałą odpowiedź @sasquatch dał powyżej.
  2. 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.