Saya telah mengatur tampilan tabel dengan tautan delegasi dan sumber data yang benar .. metode reloadData memanggil sumber data dan metode delegasi kecuali untuk viewForHeaderInSection:
.
Kenapa begitu?
ios
uitableview
uitableviewsectionheader
inforeqd
sumber
sumber
heightForHeaderInSection:
diterapkan?sectionHeaderHeight
?Jawaban:
Penggunaan
tableView:viewForHeaderInSection:
mengharuskan Anda juga menerapkantableView:heightForHeaderInSection:
. Ini akan menghasilkan tinggi non-nol yang sesuai untuk header. Pastikan juga Anda tidak menerapkantableView:titleForHeaderInSection:
. Anda hanya boleh menggunakan satu atau yang lain (viewForHeader
atautitleForHeader
).sumber
numberOfSections
.titleForHeaderInSection:
danviewForHeaderInSection:
dan tampilan yang dikembalikan dari yang terakhir adalah subkelasUITableViewHeaderFooterView
makatextLabel.text
secara otomatis diatur ke versi all-caps darititleForHeaderInSection:
string. Untuk mencegah perilaku ini, jangan menerapkantitleForHeaderInSection:
atau menggunakan label khusus alih-alih yang diwarisitextLabel
.Kuncinya adalah bahwa kedua metode tersebut milik
UITableView
protokol yang berbeda :tableView:titleForHeaderInSection:
adalahUITableViewDataSource
metode protokol, di manatableView:viewForHeaderInSection
milikUITableViewDelegate
.Itu berarti:
Jika Anda menerapkan metode tetapi menetapkan diri Anda hanya sebagai
dataSource
untukUITableView
,tableView:viewForHeaderInSection
implementasi Anda akan diabaikan.tableView:viewForHeaderInSection
memiliki prioritas yang lebih tinggi. Jika Anda menerapkan kedua metode dan menetapkan diri sebagaidataSource
dandelegate
untukUITableView
, Anda akan mengembalikan tampilan untuk header bagian tetapi AndatableView:titleForHeaderInSection:
akan diabaikan.Saya juga mencoba menghapus
tableView:heightForHeaderInSection:
; itu bekerja dengan baik dan tampaknya tidak mempengaruhi prosedur di atas. Tetapi dokumentasi mengatakan bahwa itu diperlukan untuktableView:viewForHeaderInSection
bekerja dengan benar; jadi untuk amannya adalah bijaksana untuk mengimplementasikan ini juga.sumber
UITableViewDelegate
keself
, karena saya pikir, bahwatableView:viewForHeaderInSection
adalahUITableViewDataSource
metode. Terima kasih!titleForHeader
yang memiliki ukuran intrinsik. Ukuran intrinsik dihitung berdasarkan Keluarga Font dan ukuran.@rmaddy telah salah saji aturan, dua kali: pada kenyataannya,
tableView:viewForHeaderInSection:
tidak tidak mengharuskan Anda juga menerapkantableView:heightForHeaderInSection:
, dan juga itu adalah baik-baik saja untuk memanggil keduatitleForHeader
danviewForHeader
. Saya akan menyatakan aturan dengan benar hanya untuk catatan:Aturannya sederhana yang
viewForHeader
tidak akan dipanggil kecuali Anda entah bagaimana memberikan tinggi header. Anda dapat melakukan ini dalam kombinasi dari tiga cara:Implementasikan
tableView:heightForHeaderInSection:
.Atur meja
sectionHeaderHeight
.Panggil
titleForHeader
(ini entah bagaimana memberikan tinggi standar header jika tidak memiliki header).Jika Anda tidak melakukan hal-hal itu, Anda tidak akan memiliki header dan
viewForHeader
tidak akan dipanggil. Itu karena tanpa ketinggian, runtime tidak akan tahu cara mengubah ukuran tampilan, jadi tidak perlu meminta.sumber
tableView:viewForHeaderInSection:
: "Metode ini hanya berfungsi dengan benar bilatableView:heightForHeaderInSection:
juga diterapkan.".titleForHeaderInSection
danviewForHeaderInSection
? Tampilan tabel hanya akan memanggil salah satu dari keduanya (saya lupa yang diutamakan saat ini).viewForHeader
disebut tanpa salah satu dari ketiga cara menetapkan ketinggian. Saya mengalami hal ini, di mana sayaviewForHeader
dipanggil dan tajuk muncul dengan baik, sampai suatu hari, tanpa perubahan pada bagian saya, mereka tidak . Saat itulah saya mulai bereksperimen untuk menemukan apa persyaratan minimal untukviewForHeader
dipanggil. Dan sekarang saya tahu. Dan sekarang Anda juga.Memberi
estimatedSectionHeaderHeight
dansectionHeaderHeight
nilai - nilai memperbaiki masalah saya. misalnya,self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
sumber
Keluar dari jawaban rmaddy, saya mencoba menyembunyikan tampilan Header dan mengembalikan 0.0f untuk "tableView: heightForHeaderInSection" dan 0 tinggi View from
tableView:viewForHeaderInSection
.Setelah berubah dari
return 1.0f
kereturn 0.0f
dalamtableView:heightForHeaderInSection
, metode delegasitableView:viewForHeaderInSection
memang dipanggil.Ternyata efek yang saya inginkan berfungsi tanpa harus menggunakan "tableView: heightForHeaderInSection"; tetapi ini mungkin berguna bagi orang lain yang mengalami masalah mendapatkan metode delegasi "tableView: heightForHeaderInSection" yang dipanggil.
sumber
Anda harus menerapkan
tableView:heightForHeaderInSection:
dan mengatur ketinggian untuk tajuk> 0.Metode delegasi ini sejalan dengan
viewForHeaderInSection:
metode tersebut.Saya harap ini membantu.
sumber
Perlu dicatat secara singkat bahwa jika implementasi
tableView:heightForHeaderInSection:
pengembalian AndaUITableViewAutomaticDimension
, makatableView:viewForHeaderInSection:
tidak akan dipanggil.UITableViewAutomaticDimension
mengasumsikan bahwa standarUITableViewHeaderFooterView
akan digunakan yang diisi dengan metode delegasitableView:titleForHeaderInSection:
.Dari komentar di
UITableView.h
:sumber
estimatedSectionHeaderHeight
nilai tertentu,tableView:viewForHeaderInSection
akan dipanggil (mirip dengan cara dimensi otomatis untuk baris bekerja)Saya baru saja mengalami masalah dengan tajuk yang tidak ditampilkan untuk iOS 7.1 , tetapi bekerja dengan baik dengan rilis selanjutnya yang telah saya uji, secara eksplisit dengan 8.1 dan 8.4.
Untuk kode yang sama persis, 7.1 sama sekali tidak memanggil metode delegasi header bagian, termasuk:
tableView:heightForHeaderInSection:
dantableView:viewForHeaderInSection:
.Setelah bereksperimen, saya menemukan bahwa menghapus baris ini dari
viewDidLoad
header buatan saya muncul kembali untuk 7.1 dan tidak memengaruhi versi lain yang saya uji:... jadi, sepertinya ada semacam konflik di sana untuk 7.1, setidaknya.
sumber
Masalah yang sama terjadi dengan saya tetapi karena saya menggunakan perhitungan tinggi otomatis dari xCode 9 , saya tidak dapat memberikan nilai ketinggian yang eksplisit seperti yang disebutkan di atas. Setelah beberapa percobaan saya mendapat solusi , kita harus mengganti metode ini sebagai,
Meskipun saya sudah memeriksa kedua opsi
dari storyboard seperti kata apel, tapi tetap saja saya mendapat kesalahan aneh ini.
Harap Catatan : Kesalahan ini hanya ditampilkan pada versi IOS-10 bukan pada versi IOS-11 . Mungkin ini bug dari xCode. Terima kasih
sumber
Inilah yang saya temukan ( Swift 4 ) (terima kasih atas komentar ini pada pertanyaan lain)
Apakah saya menggunakan titleForHeaderInSection atau viewForHeaderInSection - bukan karena mereka tidak dipanggil ketika tampilan tabel digulir dan sel-sel baru dimuat, tetapi setiap pilihan font yang saya buat untuk headerView's textLabel hanya muncul pada apa yang awalnya terlihat pada memuat , dan tidak seperti tabel digulir.
Cara mengatasinya adalah willDisplayHeaderView:
sumber
Dalam kasus saya, saya telah membuat tampilan tajuk menggunakan
UITableviewCell
dan mengembalikan selviewForHeaderInSection
seperti iniubah ini menjadi
Bekerja untukku.
sumber
Dalam kasus saya
diimplementasikan dalam kelas turunan jauh yang tidak mengganggu untuk daisy ke kelas super.
sumber
Alasan mengapa
viewForHeaderInSection
tidak dipanggil adalah karena satu dari dua alasan:Entah Anda tidak mengatur
UITableViewDelegate
, atau salah mengaturUITableViewDelegate
.sumber
Dalam kasus saya itu karena saya tidak menerapkan:
sumber
Kadang-kadang pengaturan
tableview.delegate
ataudatasource = nil
dalamviewWillAppear:
atauviewDidAppear:
metode dapat menyebabkan masalah ini. Pastikan untuk tidak melakukan ini ...sumber
Saya telah memotong & menempel dua metode berikut dari proyek Swift 2 ke proyek Swift 3 saya yang tidak pernah dipanggil karena di Swift 3 metode ini harus memiliki "-" sebelum nama parameter pertama.
sumber