Saya menerapkan tajuk bagian yang dapat diciutkan dalam UITableViewController.
Inilah cara saya menentukan berapa banyak baris untuk ditampilkan per bagian:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.sections[section].isCollapsed ? 0 : self.sections[section].items.count
}
Ada struct yang menyimpan info bagian dengan bool untuk 'isCollapsed'.
Inilah cara saya mengubah status mereka:
private func getSectionsNeedReload(_ section: Int) -> [Int]
{
var sectionsToReload: [Int] = [section]
let toggleSelectedSection = !sections[section].isCollapsed
// Toggle collapse
self.sections[section].isCollapsed = toggleSelectedSection
if self.previouslyOpenSection != -1 && section != self.previouslyOpenSection
{
self.sections[self.previouslyOpenSection].isCollapsed = !self.sections[self.previouslyOpenSection].isCollapsed
sectionsToReload.append(self.previouslyOpenSection)
self.previouslyOpenSection = section
}
else if section == self.previouslyOpenSection
{
self.previouslyOpenSection = -1
}
else
{
self.previouslyOpenSection = section
}
return sectionsToReload
}
internal func toggleSection(_ header: CollapsibleTableViewHeader, section: Int)
{
let sectionsNeedReload = getSectionsNeedReload(section)
self.tableView.beginUpdates()
self.tableView.reloadSections(IndexSet(sectionsNeedReload), with: .automatic)
self.tableView.endUpdates()
}
Semuanya berfungsi dan menjiwai dengan baik, namun di konsol ketika menutup bagian yang diperluas, saya mendapatkan [Tegas] ini:
[Tegaskan] Tidak dapat menentukan indeks baris global baru untuk preReloadFirstVisibleRow (0)
Ini terjadi, terlepas dari apakah itu Bagian yang sama dibuka, ditutup (runtuh), atau jika saya membuka bagian lain dan 'menutup otomatis' bagian yang sebelumnya terbuka.
Saya tidak melakukan apa pun dengan data; itu gigih.
Adakah yang bisa membantu menjelaskan apa yang hilang? Terima kasih
sumber
Jawaban:
Agar tableView tahu di mana ia berada saat memuat ulang baris, dll, ia mencoba menemukan "jangkar baris" yang digunakannya sebagai referensi. Ini disebut a
preReloadFirstVisibleRow
. Karena tableView ini mungkin tidak memiliki baris yang terlihat di beberapa titik karena semua bagian yang diciutkan, tableView akan menjadi bingung karena tidak dapat menemukan jangkar. Kemudian akan diatur ulang ke atas.Solusi: Tambahkan baris ketinggian 0 untuk setiap grup yang diciutkan. Dengan begitu, bahkan jika suatu bagian diciutkan, masih ada hadiah baris (walaupun tinggi 0px). TableView kemudian selalu memiliki sesuatu untuk dihubungkan sebagai referensi. Anda akan melihat ini berlaku dengan menambahkan baris
numberOfRowsInSection
jika jumlah baris 0 dan menanganiindexPath.row
panggilan lebih lanjut dengan memastikan untuk mengembalikan nilai sel phatom sebelumindexPath.row
diperlukan jikadatasource.visibleRows
0.Lebih mudah untuk demo dalam kode:
sumber