2008-10-01 9 views
31

In einer App, an der ich arbeite, habe ich eine einfache UITableView-Ansicht, die einen Abschnitt enthalten kann, der null Zeilen enthält. Ich möchte in der Lage sein, mit scrollToRowAtIndexPath zu diesem Abschnitt zu scrollen: atScrollPosition: animiert: aber ich erhalte einen Fehler, wenn ich versuche, zu diesem Abschnitt zu scrollen, da keine untergeordneten Zeilen vorhanden sind.Wie scrolle ich ein UITableView zu einem Abschnitt, der keine Zeilen enthält?

Apples Kalenderanwendung ist in der Lage, dies zu tun, wenn Sie Ihren Kalender in der Listenansicht betrachten und für Ihren heutigen Tag keine Ereignisse in Ihrem Kalender vorhanden sind, wird heute ein leerer Abschnitt eingefügt und Sie können mit dem Heute zu diesem Kalender blättern Schaltfläche in der Symbolleiste am unteren Bildschirmrand. Soweit ich sagen kann Apple eine benutzerdefinierte UITableView verwenden, oder sie verwenden eine private API ...

Die einzige Problemumgehung, die ich vorstellen kann, ist eine leere UITableCell in das 0 Pixel hoch einfügen und scrollen zu Das. Aber es ist mein Verständnis, dass Zellen mit unterschiedlichen Höhen wirklich schlecht für die Scroll-Performance sind. Trotzdem werde ich es trotzdem versuchen, vielleicht wird der Performance-Hit nicht so schlecht sein.

aktualisiert

Da es keine Lösung für dieses Problem scheint zu sein, ich habe einen Bug-Report mit Apfel abgelegt. Wenn dies auch Sie betroffen sind, ein Duplikat rdar Datei:. // Problem/6263339 (Open Radar link), wenn Sie dies diese schneller behoben zu bekommen

Update # 2

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

Antwort

113

UPDATE: Sieht aus wie dieser Fehler in iOS 3.0 behoben ist. Sie können die folgenden NSIndexPath verwenden, um einen Abschnitt Zeile mit 0 zu blättern:

[NSIndexPath indexPathForRow:NSNotFound inSection:section] 

Ich werde mein ursprüngliches Problem zu umgehen lassen hier für jeden noch ein Projekt mit dem 2.x SDK beibehalten wird.


eine annehmbare Behelfslösung Gefunden:

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

Der obige Code wird den tableview bewegen so den gewünschten Abschnitt sichtbar ist, aber nicht unbedingt an der Oberseite oder der 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]; 

Ändern sectionRect wie gewünscht den gewünschten Abschnitt nach unten oder in der Mitte des sichtbaren Bereichs zu blättern.

+0

[tableview scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 insection: section] atScrollPosition: UITableViewScrollPositionTop animiert: JA]; ist einfacher. – Ajumal

+0

@Aju Ihre Methode kann nicht zum Abschnittskopf blättern –

-1

ich eine leere Zeile denken, 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 Sie, wie die Aufführung ist Warnungen über die Verwendung transparenter Unteransichten in Ihren Listenelementen, und ich habe nicht festgestellt, dass es in meiner Anwendung sehr wichtig war.

4

Dies ist eine alte Frage, aber Apple hat immer noch nichts hinzugefügt, das hilft oder den Absturzfehler behebt, wo der Abschnitt keine Zeilen hat.

Für mich ich wirklich einen neuen Abschnitt blättern in die Mitte, wenn sie zu machen brauchte, 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]; 
} 

Hoffnung mögen Sie es - es auf Mike Akers' Code, wie Sie basiert kann sehen, aber macht die Berechnung für das Scrollen in die Mitte statt oben. Danke Mike - du bist ein Star.

0

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