2009-08-27 8 views
10

Ich möchte eine Art von Aktualisierung eines UITextView durchführen, um die Textansicht in den ursprünglichen Zustand zurückzusetzen. Ich habe einen Absatz, der abhängig davon, auf welches TableViewCell der Benutzer klickt, dynamisch ausgefüllt wird. Wenn Sie also im Textfeld blättern, gehen Sie zurück und wählen Sie eine andere Zelle aus und kehren Sie zurück, der Text ändert sich, aber die Bildlaufposition bleibt so, wie der Benutzer sie verlassen hat. Wie kann ich den Standardzustand wiederherstellen? Vielen Dank!Aktualisieren der Bildlaufposition von UITextView auf dem iPhone

+0

Als Hinweis, ich habe versucht, [myTextView scrollRangeToVisible: NSMakeRange ([myTextView.text Länge], 0)] zu verwenden; –

Antwort

27

Im Standardzustand, meinen Sie nach oben scrollen? Wenn ja, sind Sie auf dem richtigen Weg. Versuchen

[myTextView scrollRangeToVisible:NSMakeRange(0, 0)]; 
+1

Ich habe das auch versucht, aber es schien nicht an den eigentlichen Anfang des Textes zu gehen. Es kommt nur nah an die Spitze, sieht aber nicht wie der Standard aus. Ehrlich gesagt verstehe ich das NSRange-Zeug nicht wirklich. –

+0

Ich habe das gerade mit einer App versucht, die ich habe, und es funktioniert für mich. Können Sie einen Screenshot Ihres Simulators posten, damit wir das Verhalten sehen können? –

+0

Hier sind einige Screencaps: INITIAL, MANUELL ROLLEN, & RELOADED http://www.angelfilm.net/external/stackoverflow/mos/ –

8

Ich habe festgestellt, dass, wenn ich die UITextView löschen und dann den neuen Text anwenden, wird es automatisch „scrollen“ zurück nach oben.

myTextView.text = @""; 
myTextView.text = theRealTextContent; 
1

Keines dieser Ansätze funktionierte für mich zufriedenstellend.

  • scrollRangeToVisible produziert Tonnen visuelle Artefakte (viel Scrollen, wenn zwischen den großen Strings schaltend), und in der Tat funktioniert nur überhaupt in einem verzögerten Aufruf einige Zeit (ich verwendete 0,1 Sekunden), nachdem der Inhalt wurde geändert, nicht direkt, wie Shaggy Frogs Antwort impliziert.

  • das Einstellen des Textes auf @ "" vor dem Einstellen des neuen Inhalts hat nicht geholfen, auch nicht mit einer Verzögerung.

Es scheint, als ob einmal ein UITextView in getippt wurde, ist es für immer in diesem Modus ist, wo lästiges Scrollen Artefakte neue Inhalte einstellen verursacht. Ich habe versucht, selectionRange auch auf den Anfang der UITextView zu setzen, aber das hat nicht geholfen. Es hat auch nicht geholfen, die resignFirstResponder-Nachricht zu senden, bevor der neue Inhalt eingestellt wurde.

Aus diesem Grund habe ich entschieden, die UITextView jedes Mal zu löschen und neu zu erstellen, wenn ich den Inhalt ändere. Das ist ein selten genug Ereignis (basierend auf menschlicher Interaktion) in meiner App, dass es kein Leistungsproblem ist. Es war die einzige Möglichkeit, "neue Inhalte" ohne lästige Scrolling-Artefakte in den UITextView zu laden.

Meine Erfahrung ist, mit OS3.2 (ipad Simulator)

5
[textview setScrollEnabled:YES]; 
textview.text = yourText; 
[textview setScrollEnabled:NO]; 
+0

wollte ich eigentlich den TextView vom Scrollen beim Aktualisieren des Inhalts stoppen , also habe ich es einfach umgekehrt gemacht und es funktioniert einwandfrei. Vielen Dank. – soemarko

1

ich es geschafft, um das gewünschte Ergebnis zu erhalten - zwingt die UITextView zu ‚blättern‘ an die Spitze ihres Inhalts, wenn Enden bearbeiten. Aber um es zu erreichen, musste ich das Scrollen in textViewDidEndEditing BEIDE deaktivieren und auch den Text auf die gleiche Weise zurücksetzen.

ich wieder aktivieren Scrollen in TextViewDidBeginEditing.

- (void) textViewDidEndEditing: textView; 
{ 
    [textView setScrollEnabled: NO]; 
    NSString* savedText = [textView text]; 
    [textView setText:@""]; 
    [textView setText: savedText]; 
} 
6

Dies funktioniert, wenn Sie es wollen nach oben, um nach oben:

[theTextView scrollRangeToVisible:NSMakeRange(0, 0)]; 

Das einzige Problem ist, dass dieser seinen Weg bis beseelt. Wenn Sie es an die Spitze schnappen möchten, verwenden Sie diese:

[theTextView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
+0

Diese Lösung funktionierte für mich. Ich habe Text in viewDidLoad geladen, das ContentInset von UITextView geändert und dann scrollRectToVisible verwendet, um den oberen Bereich richtig auszurichten. Vielen Dank – TMilligan

0

Was schließlich für mich gearbeitet, was den Textinhalt zu löschen und setzen Sie ihn dann mit dem gewünschten Text auf der nächsten Lauf Schleife.

// clear the text view 
self.textView.text = "" 

// set the text on the next run loop 
dispatch_async(dispatch_get_main_queue()) { 
    self.textView.text = someText 
}