2017-04-22 4 views
1

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() 
+0

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

+0

@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

Antwort

1

Sie Wiederverwendung der Kopf Ansichten aber nicht section auf die neue Datenquelle Struktur entsprechen aktualisieren. Sie müssen die Headeransichten aktualisieren, die nach dem Minimieren/Erweitern sichtbar sind.

+0

Ich habe nach dem Entfernen des Abschnitts eine' reloadData() 'zu meiner tableView hinzugefügt und es funktioniert jetzt ... – iamhx

+0

Das ist ein anderer Weg, obwohl ich ' Bist du nicht sicher, dass du immer noch die gewünschten Animationen bekommst, wenn du kollabierst? – sooper

+0

Hmm, ja es scheint ein Problem mit den Animationen zu geben, wenn ich den ersten Abschnitt entferne ... Der zweite Abschnitt bewegt sich nur an Stelle von Abschnitt und Reihe nach oben. – iamhx

Verwandte Themen