it-swarm.com.de

Wie scrolle ich eine UITableView zu einem Abschnitt, der keine Zeilen enthält?

In einer App, an der ich arbeite, habe ich eine UITableView im einfachen Stil, die einen Abschnitt mit null Zeilen enthalten kann. Ich möchte in der Lage sein, mit scrollToRowAtIndexPath: atScrollPosition: animated zu diesem Abschnitt zu scrollen, aber ich erhalte eine Fehlermeldung, wenn ich versuche, zu diesem Abschnitt zu scrollen, weil untergeordnete Zeilen fehlen.

Die Kalenderanwendung von Apple ist dazu in der Lage. Wenn Sie Ihren Kalender in der Listenansicht anzeigen und für heute keine Termine in Ihrem Kalender vorhanden sind, wird ein leerer Abschnitt für heute eingefügt und Sie können mit der Schaltfläche Heute in der Symbolleiste dorthin blättern am unteren Rand des Bildschirms. Soweit ich weiß, verwendet Apple möglicherweise ein benutzerdefiniertes UITableView oder eine private API ...

Die einzige Abhilfe, die ich mir vorstellen kann, besteht darin, eine leere UITableCell in einer Höhe von 0 Pixel einzufügen und zu dieser zu scrollen. Ich verstehe jedoch, dass Zellen unterschiedlicher Höhe für die Bildlaufleistung sehr schlecht sind. Trotzdem werde ich es trotzdem versuchen, vielleicht wird der Leistungstreffer nicht so schlimm.

Update

Da es keine Lösung dafür zu geben scheint, habe ich einen Fehlerbericht bei Apple eingereicht. Wenn dies auch Sie betrifft, legen Sie ein Duplikat von rdar: // problem/6263339 ( Radar-Link öffnen) ab, wenn dies schneller behoben werden soll.

Update Nr. 2

Ich habe eine gute Lösung für dieses Problem. Sehen Sie sich meine Antwort unten an.

31
Mike Akers

UPDATE: Anscheinend wurde dieser Fehler in iOS 3.0 behoben. Sie können die folgende NSIndexPath verwenden, um zu einem Abschnitt mit 0 Zeilen zu blättern:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Ich lasse meine ursprüngliche Problemumgehung hier für alle, die noch ein Projekt mit dem 2.x SDK verwalten.


Eine anständige Problemumgehung gefunden:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

Der obige Code rollt die Tabellenansicht so, dass der gewünschte Abschnitt sichtbar ist, jedoch nicht notwendigerweise oben oder unten im sichtbaren Bereich. Wenn Sie so scrollen möchten, dass sich der Abschnitt oben befindet, machen Sie Folgendes:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

Ändern Sie sectionRect nach Wunsch, um den gewünschten Abschnitt zum unteren oder mittleren Bereich des sichtbaren Bereichs zu scrollen.

117
Mike Akers

Dies ist eine alte Frage, aber Apple hat immer noch nichts hinzugefügt, was den Absturzfehler verbessert oder behoben hat, wenn der Abschnitt keine Zeilen enthält.

Für mich musste ich unbedingt einen neuen Abschnitt in die Mitte scrollen lassen, wenn ich ihn hinzugefügt habe, deshalb verwende ich diesen Code:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.Origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

Ich hoffe, es gefällt euch - es basiert auf dem Code von Mike Akers, wie Sie sehen können, berechnet jedoch für das Scrollen in die Mitte statt nach oben. Danke Mike - du bist ein Star.

4
Simon Tillson

Wenn Ihr Abschnitt keine Zeilen enthält, verwenden Sie diese Option

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
0

Eine schnelle Annäherung an dasselbe:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}
0
Chaitanya Ramji