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?
sectionHeaderHeight
?
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?
sectionHeaderHeight
?
Jawaban:
Penggunaan tableView:viewForHeaderInSection:
mengharuskan Anda juga menerapkan tableView:heightForHeaderInSection:
. Ini akan menghasilkan tinggi non-nol yang sesuai untuk header. Pastikan juga Anda tidak menerapkan tableView:titleForHeaderInSection:
. Anda hanya boleh menggunakan satu atau yang lain ( viewForHeader
atau titleForHeader
).
numberOfSections
.
titleForHeaderInSection:
dan viewForHeaderInSection:
dan tampilan yang dikembalikan dari yang terakhir adalah subkelas UITableViewHeaderFooterView
maka textLabel.text
secara otomatis diatur ke versi all-caps dari titleForHeaderInSection:
string. Untuk mencegah perilaku ini, jangan menerapkan titleForHeaderInSection:
atau menggunakan label khusus alih-alih yang diwarisi textLabel
.
Kuncinya adalah bahwa kedua metode tersebut milik UITableView
protokol yang berbeda : tableView:titleForHeaderInSection:
adalah UITableViewDataSource
metode protokol, di mana tableView:viewForHeaderInSection
milik UITableViewDelegate
.
Itu berarti:
Jika Anda menerapkan metode tetapi menetapkan diri Anda hanya sebagai
dataSource
untuk UITableView
, tableView:viewForHeaderInSection
implementasi Anda
akan diabaikan.
tableView:viewForHeaderInSection
memiliki prioritas yang lebih tinggi. Jika Anda menerapkan kedua metode dan menetapkan diri sebagai
dataSource
dan delegate
untuk UITableView
, Anda akan mengembalikan tampilan untuk header bagian tetapi Anda
tableView: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 untuk tableView:viewForHeaderInSection
bekerja dengan benar; jadi untuk amannya adalah bijaksana untuk mengimplementasikan ini juga.
UITableViewDelegate
ke self
, karena saya pikir, bahwa tableView:viewForHeaderInSection
adalah UITableViewDataSource
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 menerapkan tableView:heightForHeaderInSection:
, dan juga itu adalah baik-baik saja untuk memanggil kedua titleForHeader
dan viewForHeader
. 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.
tableView:viewForHeaderInSection:
: "Metode ini hanya berfungsi dengan benar bila tableView:heightForHeaderInSection:
juga diterapkan.".
titleForHeaderInSection
dan viewForHeaderInSection
? 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 saya viewForHeader
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 untuk viewForHeader
dipanggil. Dan sekarang saya tahu. Dan sekarang Anda juga.
Memberi estimatedSectionHeaderHeight
dan sectionHeaderHeight
nilai - nilai memperbaiki masalah saya. misalnya,
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
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
ke return 0.0f
dalam tableView:heightForHeaderInSection
, metode delegasi tableView: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.
Anda harus menerapkan tableView:heightForHeaderInSection:
dan mengatur ketinggian untuk tajuk> 0.
Metode delegasi ini sejalan dengan viewForHeaderInSection:
metode tersebut.
Saya harap ini membantu.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
Perlu dicatat secara singkat bahwa jika implementasi tableView:heightForHeaderInSection:
pengembalian Anda UITableViewAutomaticDimension
, maka tableView:viewForHeaderInSection:
tidak akan dipanggil.
UITableViewAutomaticDimension
mengasumsikan bahwa standar UITableViewHeaderFooterView
akan digunakan yang diisi dengan metode delegasi tableView:titleForHeaderInSection:
.
Dari komentar di UITableView.h
:
Mengembalikan nilai ini dari
tableView:heightForHeaderInSection:
atautableView:heightForFooterInSection:
menghasilkan ketinggian yang sesuai dengan nilai yang dikembalikan daritableView:titleForHeaderInSection:
atautableView:titleForFooterInSection:
jika judul tidak nol.
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:
dan tableView: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:
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
... jadi, sepertinya ada semacam konflik di sana untuk 7.1, setidaknya.
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,
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
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
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:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}
Dalam kasus saya, saya telah membuat tampilan tajuk menggunakan UITableviewCell
dan mengembalikan sel viewForHeaderInSection
seperti ini
return cell
ubah ini menjadi
return cell.contentView
Bekerja untukku.
Dalam kasus saya
viewForHeaderInSection
diimplementasikan dalam kelas turunan jauh yang tidak mengganggu untuk daisy ke kelas super.
Alasan mengapa viewForHeaderInSection
tidak dipanggil adalah karena satu dari dua alasan:
Entah Anda tidak mengatur UITableViewDelegate
, atau salah mengatur UITableViewDelegate
.
Dalam kasus saya itu karena saya tidak menerapkan:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
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.
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:
diterapkan?