Skonfigurowałem tableview z poprawnymi powiązaniami delegata i źródła danych. Metoda reloadData wywołuje źródło danych i metody delegata, z wyjątkiem metod viewForHeaderInSection:
.
Dlaczego to jest takie?
ios
uitableview
uitableviewsectionheader
inforeqd
źródło
źródło
heightForHeaderInSection:
wdrożono?sectionHeaderHeight
?Odpowiedzi:
Korzystanie z
tableView:viewForHeaderInSection:
wymagań, które również wdrażasztableView:heightForHeaderInSection:
. Powinno to zwrócić odpowiednią niezerową wysokość nagłówka. Upewnij się również, że nie implementujesz równieżtableView:titleForHeaderInSection:
. Powinieneś używać tylko jednego lub drugiego (viewForHeader
lubtitleForHeader
).źródło
numberOfSections
.titleForHeaderInSection:
i,viewForHeaderInSection:
a widok zwrócony z tego ostatniego jest podklasą,UITableViewHeaderFooterView
totextLabel.text
jest automatycznie ustawiany na wersjętitleForHeaderInSection:
napisu pisaną wielkimi literami . Aby temu zapobiec, nie implementujtitleForHeaderInSection:
ani nie używaj etykiety niestandardowej zamiast etykiety dziedziczonejtextLabel
.Sztuczka polega na tym, że te dwie metody należą do różnych
UITableView
protokołów:tableView:titleForHeaderInSection:
jest toUITableViewDataSource
metoda protokołu, do którejtableView:viewForHeaderInSection
należyUITableViewDelegate
.To znaczy:
Jeśli zaimplementujesz metody, ale przypiszesz siebie tylko jako
dataSource
forUITableView
, TwojatableView:viewForHeaderInSection
implementacja zostanie zignorowana.tableView:viewForHeaderInSection
ma wyższy priorytet. Jeśli zaimplementujesz obie metody i przypiszesz siebie zarówno jako, jakdataSource
idelegate
dlaUITableView
, zwrócisz widoki nagłówków sekcji, ale TwójtableView:titleForHeaderInSection:
zostanie zignorowany.Próbowałem też usunąć
tableView:heightForHeaderInSection:
; działało dobrze i nie miało wpływu na powyższe procedury. Ale dokumentacja mówi, że jest to wymaganetableView:viewForHeaderInSection
do prawidłowego działania; więc dla bezpieczeństwa warto to również wdrożyć.źródło
UITableViewDelegate
doself
, bo pomyślałem, żetableView:viewForHeaderInSection
toUITableViewDataSource
metoda. Dziękuję Ci!titleForHeader
która ma rozmiar wewnętrzny. Rozmiar wewnętrzny jest obliczany na podstawie rodziny czcionek i rozmiaru.@rmaddy jest nieprawdziwe regułę, dwukrotnie: w rzeczywistości,
tableView:viewForHeaderInSection:
czy nie wymagają także wdrożeniatableView:heightForHeaderInSection:
, a także jest perfekcyjnie zadzwonić zarównotitleForHeader
iviewForHeader
. Prawidłowo podam regułę tylko do protokołu:Zasada jest taka,
viewForHeader
że nie zostanie wywołana, chyba że w jakiś sposób nadasz nagłówkowi wysokość. Możesz to zrobić na trzy sposoby:Wdrażaj
tableView:heightForHeaderInSection:
.Nakryj do stołu
sectionHeaderHeight
.Call
titleForHeader
(to w jakiś sposób nadaje nagłówkowi domyślną wysokość, jeśli w przeciwnym razie nie ma takiej).Jeśli nie zrobisz żadnej z tych rzeczy, nie będziesz mieć nagłówków i
viewForHeader
nie zostaniesz wywołany. Dzieje się tak, ponieważ bez wysokości środowisko wykonawcze nie będzie wiedziało, jak zmienić rozmiar widoku, więc nie zawraca sobie głowy pytaniem o jeden.źródło
tableView:viewForHeaderInSection:
: „Ta metoda działa poprawnie tylko wtedy, gdytableView:heightForHeaderInSection:
jest również zaimplementowana”.titleForHeaderInSection
iviewForHeaderInSection
? Widok tabeli wywoła tylko jeden z dwóch (zapominam, który w tej chwili ma pierwszeństwo).viewForHeader
jest wywoływany bez żadnego z tych trzech sposobów przypisywania wysokości. Zdarzyło mi się to, że mójviewForHeader
został sprawdzony i nagłówki pokazały się dobrze, aż pewnego dnia, bez żadnej zmiany z mojej strony, nie . Wtedy zacząłem eksperymentować, aby odkryć, jakie mająviewForHeader
być minimalne wymagania . Teraz już wiem. A teraz ty też.Dawanie
estimatedSectionHeaderHeight
isectionHeaderHeight
wartości rozwiązały mój problem. na przykład,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
źródło
Wychodząc z odpowiedzi rmaddy, próbowałem ukryć widok nagłówka i zwracałem 0,0f dla „tableView: heightForHeaderInSection” i widoku z wysokości 0
tableView:viewForHeaderInSection
.Po zmianie z
return 1.0f
nareturn 0.0f
in faktycznietableView:heightForHeaderInSection
wywołano metodę delegatatableView:viewForHeaderInSection
.Okazuje się, że mój pożądany efekt działa bez konieczności używania "tableView: heightForHeaderInSection"; ale może to być przydatne dla innych, którzy mają problem z wywołaniem metody delegata „tableView: heightForHeaderInSection”.
źródło
Należy zaimplementować
tableView:heightForHeaderInSection:
i ustawić wysokość nagłówka> 0.Ta metoda delegata jest zgodna z
viewForHeaderInSection:
metodą.Mam nadzieję, że to pomoże.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 40; }
źródło
Warto krótko zaznaczyć, że jeśli Twoja realizacja
tableView:heightForHeaderInSection:
zwrotówUITableViewAutomaticDimension
, totableView:viewForHeaderInSection:
nie zostanie wywołana.UITableViewAutomaticDimension
zakłada, żeUITableViewHeaderFooterView
zostanie użyty standard wypełniony metodą delegatatableView:titleForHeaderInSection:
.Z komentarzy w
UITableView.h
:źródło
estimatedSectionHeaderHeight
jakąś wartość,tableView:viewForHeaderInSection
zostanie wywołany (podobnie jak działa automatyczne wymiary dla wierszy)Właśnie miałem problem z nagłówkami, które nie były wyświetlane w iOS 7.1 , ale działały dobrze z późniejszymi wersjami, które testowałem, wyraźnie z 8.1 i 8.4.
Dla dokładnie tego samego kodu 7.1 w ogóle nie wywoływał żadnej z metod delegata nagłówka sekcji, w tym:
tableView:heightForHeaderInSection:
itableView:viewForHeaderInSection:
.Po eksperymentach stwierdziłem, że usunięcie tej linii z moich
viewDidLoad
utworzonych nagłówków pojawia się ponownie w wersji 7.1 i nie ma wpływu na inne wersje, które testowałem:// _Removing_ this line _fixed_ headers on 7.1 self.tableView.estimatedSectionHeaderHeight = 80;
… Więc wydaje się, że jest tam jakiś konflikt, przynajmniej w wersji 7.1.
źródło
Ten sam problem wystąpił ze mną, ale ponieważ korzystałem z automatycznego obliczania wysokości z xCode 9 , nie mogę podać żadnej wyraźnej wartości wysokości, jak wspomniano powyżej. Po kilku eksperymentach otrzymałem rozwiązanie , musimy zastąpić tę metodę, ponieważ
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section { return 44.0f; }
Chociaż mam zaznaczone obie opcje
ze scenorysu, jak mówi Apple, ale nadal mam ten dziwny błąd.
Uwaga : ten błąd był wyświetlany tylko w wersji IOS-10, a nie w wersji IOS-11 . Może to błąd z xCode. Dzięki
źródło
Oto, co znalazłem ( Swift 4 ) (dzięki temu komentarzowi do innego pytania)
Czy użyłem titleForHeaderInSection czy viewForHeaderInSection - nie chodziło o to, że nie były wywoływane, gdy przewijano widok tabeli i ładowano nowe komórki, ale wszelkie wybory czcionek, które wybrałem dla textLabel headerView, pojawiały się tylko na tym, co było początkowo widoczne po załadowaniu , a nie podczas przewijania tabeli.
Poprawka to willDisplayHeaderView:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { if let header = view as? UITableViewHeaderFooterView { header.textLabel?.font = UIFont(name: yourFont, size: 42) } }
źródło
W moim przypadku utworzyłem widok nagłówka, używając
UITableviewCell
i zwracając komórkę wviewForHeaderInSection
ten sposóbreturn cell
zmieniono to na
return cell.contentView
Pracował dla mnie.
źródło
W moim przypadku
został zaimplementowany w odległej klasie pochodnej, która nie zawracała sobie głowy stokrotką w superklasie.
źródło
Przyczyną
viewForHeaderInSection
braku połączenia jest jeden z dwóch powodów:Albo nie skonfigurowałeś swojego
UITableViewDelegate
, alboUITableViewDelegate
nieprawidłowo skonfigurowałeś .źródło
W moim przypadku to dlatego, że nie wdrożyłem:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
źródło
Czasami ustawienie
tableview.delegate
lubdatasource = nil
w metodachviewWillAppear:
lubviewDidAppear:
może powodować ten problem. Upewnij się, że tego nie robisz ...źródło
Wycinałem i wklejałem następujące dwie metody z projektu Swift 2 do mojego projektu Swift 3, które nigdy nie zostały wywołane, ponieważ w języku Swift 3 te metody muszą mieć znak „-” przed pierwszą nazwą parametru.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 44.0 } func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView return headerView }
źródło