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?
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?
sectionHeaderHeight
?
Odpowiedzi:
Korzystanie z tableView:viewForHeaderInSection:
wymagań, które również wdrażasz tableView: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
lub titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
i, viewForHeaderInSection:
a widok zwrócony z tego ostatniego jest podklasą, UITableViewHeaderFooterView
to textLabel.text
jest automatycznie ustawiany na wersję titleForHeaderInSection:
napisu pisaną wielkimi literami . Aby temu zapobiec, nie implementuj titleForHeaderInSection:
ani nie używaj etykiety niestandardowej zamiast etykiety dziedziczonej textLabel
.
Sztuczka polega na tym, że te dwie metody należą do różnych UITableView
protokołów: tableView:titleForHeaderInSection:
jest to UITableViewDataSource
metoda protokołu, do której tableView:viewForHeaderInSection
należy UITableViewDelegate
.
To znaczy:
Jeśli zaimplementujesz metody, ale przypiszesz siebie tylko jako
dataSource
for UITableView
, Twoja
tableView:viewForHeaderInSection
implementacja zostanie zignorowana.
tableView:viewForHeaderInSection
ma wyższy priorytet. Jeśli zaimplementujesz obie metody i przypiszesz siebie zarówno jako, jak
dataSource
i delegate
dla UITableView
, zwrócisz widoki nagłówków sekcji, ale Twój
tableView: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 wymagane tableView:viewForHeaderInSection
do prawidłowego działania; więc dla bezpieczeństwa warto to również wdrożyć.
UITableViewDelegate
do self
, bo pomyślałem, że tableView:viewForHeaderInSection
to UITableViewDataSource
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żenia tableView:heightForHeaderInSection:
, a także jest perfekcyjnie zadzwonić zarówno titleForHeader
i viewForHeader
. 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.
tableView:viewForHeaderInSection:
: „Ta metoda działa poprawnie tylko wtedy, gdy tableView:heightForHeaderInSection:
jest również zaimplementowana”.
titleForHeaderInSection
i viewForHeaderInSection
? 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ój viewForHeader
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
i sectionHeaderHeight
wartości rozwiązały mój problem. na przykład,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
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
na return 0.0f
in faktycznie tableView:heightForHeaderInSection
wywołano metodę delegata tableView: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”.
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;
}
Warto krótko zaznaczyć, że jeśli Twoja realizacja tableView:heightForHeaderInSection:
zwrotów UITableViewAutomaticDimension
, to tableView:viewForHeaderInSection:
nie zostanie wywołana.
UITableViewAutomaticDimension
zakłada, że UITableViewHeaderFooterView
zostanie użyty standard wypełniony metodą delegata tableView:titleForHeaderInSection:
.
Z komentarzy w UITableView.h
:
Zwrócenie tej wartości z
tableView:heightForHeaderInSection:
lubtableView:heightForFooterInSection:
skutkuje wysokością pasującą do wartości zwróconej ztableView:titleForHeaderInSection:
lubtableView:titleForFooterInSection:
jeśli tytuł nie jest zerowy.
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:
i tableView: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.
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
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)
}
}
W moim przypadku utworzyłem widok nagłówka, używając UITableviewCell
i zwracając komórkę w viewForHeaderInSection
ten sposób
return cell
zmieniono to na
return cell.contentView
Pracował dla mnie.
W moim przypadku
viewForHeaderInSection
został zaimplementowany w odległej klasie pochodnej, która nie zawracała sobie głowy stokrotką w superklasie.
Przyczyną viewForHeaderInSection
braku połączenia jest jeden z dwóch powodów:
Albo nie skonfigurowałeś swojego UITableViewDelegate
, albo UITableViewDelegate
nieprawidłowo skonfigurowałeś .
W moim przypadku to dlatego, że nie wdrożyłem:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
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
}
heightForHeaderInSection:
wdrożono?