2009-08-27 67 views
10

我想對UITextView進行一些類型的刷新以將文本視圖重新設置爲原始狀態。我有一個動態填充的段落,取決於用戶點擊哪個TableViewCell。因此,當他們滾動文本字段,然後返回並選擇另一個單元格並返回時,文本會更改,但滾動位置仍然保留在用戶離開它的位置。我怎樣才能將它恢復到默認狀態。謝謝!刷新UITextView在iPhone上的滾動位置

+0

作爲一個說明,我已經試圖使用 [myTextView scrollRangeToVisible:NSMakeRange([myTextView.text長度],0)]; – 2009-08-27 22:28:07

回答

27

默認情況下,你的意思是滾動到頂部?如果是這樣,你就走在正確的軌道上。嘗試

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

我也嘗試過,但它似乎沒有進入真正的文本頂部。它只接近頂部,但看起來不像默認。老實說,我並沒有很好的理解NSRange的東西。 – 2009-08-27 23:08:18

+0

我剛剛用我有的應用程序試過這個,它適用於我。你能發佈你的模擬器的截圖,以便我們看到行爲? – 2009-08-27 23:37:14

+0

以下是一些屏幕截圖:初始,手動向下滾動和重新加載 http://www.angelfilm.net/external/stackoverflow/mos/ – 2009-08-28 17:08:39

8

我發現,如果我先清除UITextView,然後應用新文本,它會自動「滾動」回到頂部。

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

這兩種方法都不能滿足我的要求。

  • scrollRangeToVisible產生噸視覺僞像(大量大串之間切換時滾動),並且實際上只有在所有工作在延遲呼叫的內容後的一段時間(I使用0.1秒)已被改變,並不像Shaggy Frog的回答所暗示的那樣直接。

  • 在設置新內容之前將文本設置爲@「」並沒有幫助,即使有延遲。

看來,如果一旦一個UITextView已經輸入了,它永遠是在這種模式下設置了新的內容會導致惱人的滾動文物。我試着將selectionRange設置爲UITextView的開頭,但這沒有幫助。在設置新內容之前發送resignFirstResponder消息也沒有幫助。

因此,我決定每次更改內容時刪除並重新創建UITextView。在我的應用中,這是一個罕見的事件(基於人爲交互),這不是性能問題。這是我能找到的「加載新內容」進入UITextView而沒有大量煩人的滾動工件的唯一方法。

我的經驗是OS3.2(新iPad模擬器)

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

我實際上想要停止textView從滾動更新內容,所以我只是反其道而行,它完美無瑕。謝謝。 – soemarko 2013-05-29 20:57:18

1

我設法得到期望的結果 - 在強制的UITextView以「滾動」其內容的頂部編輯結束時。但要實現它,我必須同時停用textViewDidEndEditing中的滾動功能,並且還要使用相同的方法重置文本。

我重新啓用了textViewDidBeginEditing中的滾動功能。

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

這個工作,如果你想讓它向上滾動到頂部:

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

唯一的問題是,這個動畫的方式了。如果你想讓它捕捉到頂部,使用此:

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

該解決方案適用於我。我在viewDidLoad中加載了文本,更改了UITextView的ContentInset,然後不得不使用scrollRectToVisible使頂部正確對齊。謝謝 – TMilligan 2013-09-26 02:05:26

0

什麼終於爲我工作怎麼清除文本內容,然後對下一個運行循環所需的文本設置。

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