Wiem, że to pytanie dotyczyło iOS 5, ale z korzyścią dla przyszłych czytelników zwróć uwagę, że efektywnego iOS 6 możemy teraz używać dequeueReusableHeaderFooterViewWithIdentifier
zamiast dequeueReusableCellWithIdentifier
.
Więc viewDidLoad
zadzwoń albo registerNib:forHeaderFooterViewReuseIdentifier:
albo registerClass:forHeaderFooterViewReuseIdentifier:
. Następnie viewForHeaderInSection
zadzwoń tableView:dequeueReusableHeaderFooterViewWithIdentifier:
. Nie używasz prototypu komórki z tym interfejsem API (jest to widok oparty na NIB lub widok utworzony programowo), ale jest to nowy interfejs API dla usuniętych z kolejki nagłówków i stopek.
Po prostu użyj prototypowej komórki jako nagłówka i / lub stopki sekcji.
tableView:viewForHeaderInSection:
metodę lubtableView:viewForFooterInSection:
metodę[tableView dequeueReusableCellWithIdentifier:]
aby uzyskać nagłówektableView:heightForHeaderInSection:
metodę.Edycja: Jak zmienić tytuł nagłówka (skomentowane pytanie):
tableView:viewForHeaderInSection:
metodzie uzyskaj etykietę, dzwoniąc:źródło
viewForHeaderInSection
metodzie (nie ma potrzeby dodawania żadnych niestandardowych UIViews).dequeueReusableHeaderFooterViewWithIdentifier
został wprowadzony i jest teraz preferowany w stosunku do tej odpowiedzi. Ale użycie tego poprawnie wymaga teraz więcej kroków. Mam przewodnik @ samwize.com/2015/11/06/ ...UITableViewCell
jako widoku nagłówka. Będziesz bardzo trudno debugować usterki wizualne - nagłówek czasami znika z powodu sposobu, w jaki komórki są usuwane z kolejki i będziesz szukał przez wiele godzin, dlaczego tak jest, dopóki nie zorientujesz się,UITableViewCell
że nie należy doUITableView
nagłówka.W systemie iOS 6.0 i nowszym sytuacja uległa zmianie wraz z nowym
dequeueReusableHeaderFooterViewWithIdentifier
interfejsem API.Napisałem poradnik (testowany na iOS 9), który można podsumować następująco:
UITableViewHeaderFooterView
viewDidLoad
viewForHeaderInSection
i użyj,dequeueReusableHeaderFooterViewWithIdentifier
aby odzyskać nagłówek / stopkęźródło
Mam to działające w iOS7 przy użyciu prototypowej komórki w scenorysie. Mam przycisk w moim niestandardowym widoku nagłówka sekcji, który wyzwala przepływ, który jest skonfigurowany w scenorysie.
Zacznij od rozwiązania Tieme
Jak wskazuje pedro.m, problem polega na tym, że dotknięcie nagłówka sekcji powoduje wybranie pierwszej komórki w sekcji.
Jak podkreśla Paul Von, problem ten rozwiązano, zwracając contentView komórki zamiast całej komórki.
Jednak, jak wskazuje Hons, długie naciśnięcie nagłówka sekcji spowoduje awarię aplikacji.
Rozwiązaniem jest usunięcie wszystkich gestówRecognizers z contentView.
Jeśli nie używasz gestów w widokach nagłówków sekcji, wydaje się, że ten mały hack załatwia sprawę.
źródło
Jeśli używasz scenorysów, możesz użyć prototypowej komórki w widoku tabeli, aby ułożyć widok nagłówka. Ustaw unikatowy identyfikator i viewForHeaderInSection możesz usunąć z kolejki komórkę o tym identyfikatorze i rzucić ją na UIView.
źródło
Jeśli potrzebujesz szybkiej implementacji tego, postępuj zgodnie ze wskazówkami dotyczącymi zaakceptowanej odpowiedzi, a następnie UITableViewController zaimplementuj następujące metody:
źródło
Rozwiązanie, które wymyśliłem, jest w zasadzie tym samym rozwiązaniem, które zastosowano przed wprowadzeniem storyboardów.
Utwórz nowy, pusty plik klasy interfejsu. Przeciągnij UIView na kanwę, układ według potrzeb.
Załaduj końcówkę ręcznie, przypisz do odpowiedniej sekcji nagłówka / stopki w metodach delegata viewForHeaderInSection lub viewForFooterInSection.
Miałem nadzieję, że Apple uprościło ten scenariusz dzięki scenorysom i szukał lepszego lub prostszego rozwiązania. Na przykład niestandardowe nagłówki i stopki tabel można łatwo dodać.
źródło
tableView:titleForHeaderInSection
, to jeden wiersz.Kiedy zwrócisz contentView komórki, będziesz miał 2 problemy:
viewForHeaderInSection
dzwonisz, tworzysz nową komórkę)Rozwiązanie:
Klasa opakowania dla nagłówka \ stopki tabeli. To tylko odziedziczony pojemnik
UITableViewHeaderFooterView
, w którym znajduje się komórkahttps://github.com/Magnat12/MGTableViewHeaderWrapperView.git
Zarejestruj klasę w swoim UITableView (na przykład w viewDidLoad)
W Twoim UITableViewDelegate:
źródło
Kiedyś wykonywałem następujące czynności, aby leniwie tworzyć widoki nagłówka / stopki:
[NSNull null]
źródło
Miałem kłopoty w scenariuszu, w którym nagłówek nigdy nie został ponownie użyty, nawet wykonując wszystkie właściwe kroki.
Tak więc jako wskazówka dla wszystkich, którzy chcą osiągnąć sytuację pokazania pustych sekcji (0 wierszy), ostrzegamy, że:
dequeueReusableHeaderFooterViewWithIdentifier nie użyje ponownie nagłówka, dopóki nie zwrócisz co najmniej jednego wiersza
Mam nadzieję, że to pomoże
źródło
Aby podążać za sugestią Damona , oto jak sprawiłem, że nagłówek można wybrać, tak jak zwykły wiersz ze wskaźnikiem ujawnienia.
Dodałem podklasę Button z UIButton (nazwa podklasy „ButtonWithArgument”) do prototypowej komórki nagłówka i usunąłem tekst tytułu (pogrubiony tekst „Tytuł” to kolejny UILabel w komórce prototypu)
następnie ustaw przycisk na cały widok nagłówka i dodaj wskaźnik ujawnienia ze sztuczką Avario
ButtonWithArgument.h
ButtonWithArgument.m
źródło
Powinieneś użyć rozwiązania Tieme jako bazy, ale zapomnij o
viewWithTag:
i innych podejrzanych podejściach, zamiast tego spróbuj przeładować nagłówek (przeładowując tę sekcję).Więc po ustawieniu niestandardowego widoku nagłówka komórki ze wszystkimi fantazyjnymi
AutoLayout
rzeczami, po prostu usuń go z kolejki i zwróć contentView po konfiguracji, na przykład:źródło
A co z rozwiązaniem, w którym nagłówek jest oparty na tablicy widoku:
Następnie w delegacie:
źródło
Dodaj komórkę
StoryBoard
i ustawreuseidentified
Kod
i
Posługiwać się:
źródło
Podobny do odpowiedzi laszlo, ale możesz ponownie użyć tej samej komórki prototypowej zarówno dla komórek tabeli, jak i komórki nagłówka sekcji. Dodaj pierwsze dwie funkcje poniżej do swojej podklasy UIViewController
źródło
Oto odpowiedź @Vitaliy Gozhenko w języku Swift.
Podsumowując, utworzysz UITableViewHeaderFooterView, który zawiera UITableViewCell. Ta UITableViewCell będzie „usuwalna” i można ją zaprojektować w swoim storyboardzie.
Utwórz klasę UITableViewHeaderFooterView
Podłącz widok tabeli do tej klasy w funkcji viewDidLoad:
Pytając o nagłówek sekcji, usuń z kolejki CustomHeaderFooterView i wstaw do niego komórkę
źródło