Frage

In einer App arbeite ich an, ich habe einen einfachen Stil UITableView, die einen Abschnitt enthält keine Zeilen enthalten kann. Ich möchte diesen Abschnitt blättern können scrollToRowAtIndexPath mit: atScrollPosition: animated: aber ich erhalte eine Fehlermeldung, wenn ich versuche, aufgrund des Fehlens von Kinder Zeilen zu diesem Abschnitt blättern

.

Apples Kalenderanwendung der Lage ist, dies zu tun, wenn Sie in Ihrem Kalender in der Listenansicht sehen, und es gibt keine Termine für heute in Ihrem Kalender, ein leerer Abschnitt ist für heute eingefügt und Sie können navigieren Sie die Heute-Taste in der Symbolleiste am unteren Rand des Bildschirms. Soweit ich sagen kann Apple eine maßgeschneiderte UITableView verwenden kann, oder sie sind eine private API ...

Die einzige Abhilfe, die ich denken kann, ist eine leere UITableCell einzufügen, dass 0 Pixel hoch ist und blättern Sie zu, dass. Aber es ist mein Verständnis, dass Zellen mit unterschiedlichen Höhen zum Scrollen Leistung wirklich schlecht ist. Ich werde noch es trotzdem versuchen, vielleicht die Leistung getroffen wird nicht so schlimm sein.

Aktualisieren

Da es scheint dies keine Lösung zu sein, ich habe einen Bug-Report mit Apfel abgelegt. Wenn dies auch Sie betroffen sind, ein Duplikat rdar file: // Problem / 6263339 ( öffnen Radar Link) , wenn Sie wollen, dass diese diese schneller behoben.

Update # 2

Ich habe eine anständige Abhilfe für dieses Problem, unten einen Blick auf meine Antwort nehmen.

War es hilfreich?

Lösung

UPDATE: Sieht aus wie dieser Bug in iOS 3.0 behoben. Sie können die folgenden NSIndexPath zu einem Abschnitt 0 Zeilen enthält, blättern Sie:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Ich werde meine ursprüngliche Problem zu umgehen hier lassen sich noch jemand ein Projekt mit dem 2.x SDK beibehalten wird.


Gefunden eine anständige Abhilfe:

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

Der obige Code wird den tableview bewegt so der gewünschte Abschnitt sichtbar ist, aber nicht unbedingt an der Oberseite oder die Unterseite des sichtbaren Bereichs. Wenn Sie also der Abschnitt blättern wollen, ist an der Spitze dies tun:

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

Modify sectionRect wie gewünscht um den gewünschten Abschnitt der Unterseite oder in der Mitte des sichtbaren Bereichs zu scrollen.

Andere Tipps

Dies ist eine alte Frage, aber Apple hat immer noch nichts hinzugefügt, die den Absturz Bug hilft oder behoben, bei dem der Abschnitt keine Zeilen hat.

Für mich brauche ich wirklich einen neuen Abschnitt blättert in die Mitte zu machen, wenn hinzugefügt, so dass ich jetzt diesen Code verwenden:

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];
}

Hoffe es gefällt euch - es auf Mike Akers' Code basiert, wie Sie sehen können, aber tut die Berechnung für statt oben in die Mitte scrollen. Dank Mike - du bist ein Stern

.

Ein Swift Annäherung an das gleiche:

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

Wenn Ihr Abschnitt haben keine Zeilen verwenden diese

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

Ich denke, eine leere Zeile ist wahrscheinlich der einzige Weg, dorthin zu gehen. Ist es möglich, die Benutzeroberfläche, so dass die „leere“ Reihe neu zu gestalten, etwas Nützliches anzeigen kann?

Ich sage probieren Sie es aus und sehen, was die Leistung ist wie. Sie geben ziemlich düstere Warnungen über die Verwendung von transparenten Unteransichten in Listenelementen, und ich fand nicht, dass es in meiner Anwendung, dass all viel zählt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top