Daraltılabilir Bölümler: [Assert] preReloadFirstVisibleRow (0) için yeni genel satır dizini belirlenemiyor


9

Bir UITableViewController daraltılabilir bölüm üstbilgileri uyguluyorum.

Bölüm başına kaç satır gösterileceğini şu şekilde belirleyebilirim:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return self.sections[section].isCollapsed ? 0 : self.sections[section].items.count
}

Bölüm bilgisini 'isCollapsed' için bir boole ile tutan bir yapı vardır.

Durumlarını şu şekilde değiştiriyorum:

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()
}

Her şey iyi çalışıyor ve canlandırıyor, ancak genişletilmiş bir bölümü daraltırken konsolda bunu alıyorum [Assert]:

[Assert] preReloadFirstVisibleRow (0) için yeni global satır dizini belirlenemedi

Bu aynı bölümün açık olup olmamasına, kapanmasına (daraltılmasına) veya başka bir bölümü açıp daha önce açık olan bölümü otomatik olarak kapatmamıza bakılmaksızın gerçekleşir.

Verilerle hiçbir şey yapmıyorum; bu kalıcı.

Neyin eksik olduğunu açıklamaya yardımcı olabilir misiniz? Teşekkürler


Tablo görünümünüz birçok gerçek satırdan oluşuyor mu?
Byron Coetsee

Bunu düzeltmeyi hiç başardın mı?
PaulDoesDev

@ByronCoetsee Bir bölüm genişletilene kadar evet. Yani hepsi çöktüğünde sadece bölüm başlıkları. Biri genişletildiğinde, genişletilmemiş bölümler için tüm bölüm başlıkları ve bir bölüm üstbilgisi ve ardından veriler için hücreler.
iOSProgrammingIsFun

@PaulDoesDev Yaptım, ama bu mekanizmayı kullanarak değil. Tamamen yeniden yazdım, böylece aynı göründüğü halde tamamen farklı çalışıyor. Bununla birlikte, birisinin bunu zarif bir şekilde düzeltebileceği veya başkalarına bir şekilde yardımcı olduğu takdirde bunu burada bırakacağım.
iOSProgrammingIsFun

1
@iOSProgrammingIsFun haha ​​evet bir hack gibi hissedebileceğini düşündüm ve teknik olarak, ancak kod miktarı ve aslında oldukça temiz olduğu gerçeği geceleri uyumaya izin verebileceğim anlamına geliyor: Aşağıda yayınlanan P kodu
Byron Coetsee

Yanıtlar:


8

TableView, satırları yeniden yüklerken nerede olduğunu bilmek için referans olarak kullandığı bir "tutturma satırı" bulmaya çalışır. Buna a denir preReloadFirstVisibleRow. Bu tableView, tüm bölümler daraltıldığı için bir noktada görünür satırlara sahip olmayabileceğinden, tableView bir çapa bulamadığı için karışacaktır. Daha sonra en üste sıfırlanır.

Çözüm: Daraltılmış her gruba 0 yükseklik satırı ekleyin. Bu şekilde, bir bölüm daraltılmış olsa bile, hala bir satır var (0 piksel yükseklikte olsa da). TableView daha sonra her zaman referans olarak takılması gereken bir şey içerir. Satır numberOfRowsInSectionsayısı 0 ise bir satır ekleyerek ve 0 ise daha indexPath.rowönce indexPath.rowgerekli olan fatom hücre değerini döndürdüğünüzden emin olarak başka çağrıları ele alarak bunu geçerli olarak göreceksiniz datasource.visibleRows.

Kodda demo yapmak daha kolaydır:

func numberOfSections(in tableView: UITableView) -> Int {
    return datasource.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return datasource[section].visibleRows.count == 0 ? 1 : datasource[section].visibleRows.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    datasource[section].section = section
    return datasource[section]
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if datasource[indexPath.section].visibleRows.count == 0 { return 0 }
    return datasource[indexPath.section].visibleRows[indexPath.row].bounds.height
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if datasource[indexPath.section].visibleRows.count == 0 { return UITableViewCell() }

    // I've left this stuff here to show the real contents of a cell - note how
    // the phantom cell was returned before this point.

    let section = datasource[indexPath.section]
    let cell = TTSContentCell(withView: section.visibleRows[indexPath.row])
    cell.accessibilityLabel = "cell_\(indexPath.section)_\(indexPath.row)"
    cell.accessibilityIdentifier = "cell_\(indexPath.section)_\(indexPath.row)"
    cell.showsReorderControl = true
    return cell
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.