Im Anschluss an die Antwort von jeantimex, wie zum Einsturz versucht, einen Abschnitt Aufklappen/Zuklappen here und seine github, habe ich die folgenden Codes die Zeilen zu verstecken, wenn ein Abschnitt abgegriffen wird:Index außerhalb des Bereichs liegt, wenn ich eine UITableView Abschnitt
struct Person {
//this is my data
let name: String
var item: [(itemName: String, price: Decimal)]
var collapsed: Bool!
init(name: String, item: [(itemName: String, price: Decimal)], collapsed: Bool = false) {
self.name = name
self.item = item
self.collapsed = collapsed
}
}
class TableSectionHeader : UITableViewHeaderFooterView {
//this is my custom header section
var delegate: CollapsibleTableViewHeaderDelegate?
var section: Int = 0
@IBOutlet weak var lblPerson: UILabel!
@IBOutlet weak var lblTotal: UILabel!
func tapHeader(_ gestureRecognizer: UITapGestureRecognizer) {
guard let cell = gestureRecognizer.view as? TableSectionHeader else {
return
}
delegate?.toggleSection(self, section: cell.section)
print(cell.section)
}
}
protocol CollapsibleTableViewHeaderDelegate {
func toggleSection(_ header: TableSectionHeader, section: Int)
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return personArray[indexPath.section].collapsed! ? 0 : 44.0
}
In meinem viewForHeaderInSection
delegieren, fügte ich ein UITapGestureRecognizer
:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cell = billTableView.dequeueReusableHeaderFooterView(withIdentifier: "TableSectionHeader")
let header = cell as! TableSectionHeader
header.section = section
header.delegate = self
header.lblPerson.text = structArray[section].name
header.lblTotal.text = SplitBill().displayIndividualTotal(person: structArray, section: section)
header.addGestureRecognizer(UITapGestureRecognizer(target: header.self, action: #selector(header.tapHeader(_:))))
return cell
}
die Abschnitte sind in der Lage perfekt zum Einsturz/erweitern, jedoch habe ich eine Schaltfläche, um einen Abschnitt zu entfernen, und wenn ich den ersten Abschnitt entfernt (0) und versuchte, sich auf einem anderen Abschnitt tippen, die App abgestürzt mit Fehler:
fatal error: Index out of range
ich einige Debug tat den Abschnitt Index zu drucken und erkannte, dass, wenn ich ein Objekt aus der Liste meiner Daten entfernt, die toggleSection
Funktion noch hielt der Index des zweiten Abschnitts (1):
extension BillForm: CollapsibleTableViewHeaderDelegate {
func toggleSection(_ header: TableSectionHeader, section: Int) {
print(section) //index is 1 although I have removed the first object
let collapsed = !personArray[section].collapsed
// Toggle collapse
personArray[section].collapsed = collapsed
// Adjust the height of the rows inside the section
billTableView.beginUpdates()
for i in 0 ..< personArray[section].item.count {
billTableView.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
}
billTableView.endUpdates()
}
}
ich bin immer noch ein wenig verwirrt und nicht sehr vertraut mit jeantimex den Code so bin ich nicht sicher, wo dies zu beheben. Kann mir jemand helfen?
EDIT:
Managed es mit reloadData()
auf meinem entfernen Abschnitt Taste zu arbeiten habe.
for i in (0..<self.personArray[row].item.count).reversed() {
let rowIndex = IndexPath(row: i, section: row)
self.personArray[row].item.remove(at: i) //remove rows first
self.billTableView.deleteRows(at: [rowIndex], with: .right)
}
self.personArray.remove(at: row) //then remove section
self.billTableView.deleteSections(IndexSet(integer: row), with: .right)
self.billTableView.reloadData()
Ich bemerkte, dass Sie den Abschnitt aus dem Header 'cell.section' erhalten - könnte es sein, dass Header nicht wiederverwendet werden, dass Sie diesen Abschnitt beim Zusammenklappen nicht aktualisieren? – sooper
@sooper Jetzt, wo Sie es erwähnen, denke ich, dass es der Fall sein könnte. Der 'cell.section' aktualisiert seinen Index nicht, wenn ich das erste Objekt entfernt habe. – iamhx