2010-04-21 17 views
7

Ich verwende iPhone SDK 3.1.3. Ich habe eine UITableViewController, die Daten von einem anderen Controller bekommt. Die Tabellenansicht wird als Unteransicht zur Hauptansicht hinzugefügt, aber der Rahmen wird so eingestellt, dass er nicht sichtbar ist. Der Tabellenansichtsrahmen wird aktualisiert und über die Hauptansicht verschoben, indem Sie auf eine Schaltfläche tippen.UITableView Scrollen zu einer bestimmten Position

Die Tabellenansicht erscheint und ich scrolle zur letzten Zeile. Wenn ich die letzte Zeile auswähle, lade ich die Tabelle mit mehr Daten neu. Die Tabelle wird mit mehr Daten aktualisiert. Alles funktioniert gut, außer die Scroll-Position ist immer oben.

Ich brauche die Scroll-Position als letzte Zeile, auf die ich geklickt habe, um mehr Daten zu laden. Ich speichere die Bildlaufposition und rufe nach dem Laden weiterer Daten den folgenden Code auf. Es wird ohne Probleme ausgeführt, aber die Scroll-Position ist immer die oberste.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:savedScrollPosition animated:NO]; 

Das oben genannte scheint keine Wirkung zu haben. ViewWillAppear:ViewDidAppear: feuert nicht und mir wird gesagt, dass, wenn der View-Controller in Code instanziiert ist, was der Fall ist, diese nicht feuern. Bitte helfen Sie mir herauszufinden, wie und wann die Scroll-Position nach dem Laden der Tabelle ([theTableView reloadData]) so eingestellt werden soll, dass es in der Zeile ist, auf die ich geklickt habe.

-Code zur Tabellenansicht & scroll

////performAction will notify the tableviewcontroller which will result in didPerformAction being called 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == lastRow) 
    { 
     savedScrollPosition = lastRow; 
     //perform the action 
     [controller performAction]; 
    } 
} 

- (void) didPerformAction:(NSNotification *)obj 
{ 
    [theTableView reloadData]; 
    [theTableView 
    scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
    atScrollPosition:UITableViewScrollPositionBottom 
    animated:NO]; 
} 

Antwort

28

Dies schien den Trick zu tun.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
CGPoint point = theTableView.contentOffset; 
point .y -= theTableView.rowHeight; 
theTableView.contentOffset = point; 
+2

Was ist SavedScrollPosition in dieser Anweisung –

0

Reload Wenn das der eigentliche Code ist und unter der Annahme theTableView ist es nicht Null ist, eine Warnung immer sagen „kann nicht antworten ...“ werden sollte, weil scrollToRowAtIndexPath ist falsch geschrieben.

Zweitens erwartet der Parameter atScrollPosition einen Enumerationswert UITableViewScrollPosition, der angibt, wo auf dem Bildschirm die Zielzeile positioniert werden soll.

Versuchen Sie folgendes:

[theTableView scrollToRowAtIndexPath: 
       [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
       atScrollPosition:UITableViewScrollPositionBottom 
       animated:NO]; 
+0

Entschuldigung, das war ein Tippfehler. Ich habe es bearbeitet. Nun, ich möchte nicht nach unten scrollen. Ich muss zu der Zeile scrollen, auf die ich geklickt habe, die jedes Mal die Mitte, aber nicht die Mitte ist. Nichtsdestotrotz habe ich das versucht und seltsam, es bleibt immer noch an der Spitze. – Dave

+0

Zeigen Sie die Methode, wo dies aufgerufen wird. Setzen Sie NSLogs vor dem Aufruf, der den Wert von savedScrollPosition anzeigt. atScrollPosition bezieht sich nicht auf die Zeilennummer, sondern auf die aktuelle relative Position auf dem Bildschirm. – DyingCactus

+0

oh ich sehe. Ich habe den Code aktualisiert. – Dave

10

Es wird besser aussehen und die Scroll-Position fixiert wird bleiben, wenn Sie die Zeilen statt reload des Aufrufs einfügen.

[theTableView beginUpdates]; 
[theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
// make sure the dataSource will return new rows before calling endUpdates 
[theTableView endUpdates]; 

Statt UITableView verwenden Scrollen können Sie UIScrollView verwenden Scrollen:

savedOffset = [theTableView contentOffset]; 

Dann wieder her:

[theTableView setContentOffset:savedOffset]; 
+0

oh danke, ich habe gerade die Antwort gepostet, die meistens die gleiche ist wie deine, und setze contentOffset. Danke für deine Tippzeile. – Dave

Verwandte Themen