2009-08-27 34 views
10

Tôi muốn thực hiện một số loại làm mới của UITextView để đặt chế độ xem văn bản trở về trạng thái ban đầu của nó. Tôi có một đoạn được điền động tùy thuộc vào TableViewCell mà người dùng nhấp vào. Vì vậy, khi họ cuộn trường văn bản, sau đó quay lại và chọn ô khác và quay lại, văn bản thay đổi, nhưng vị trí cuộn vẫn giữ nguyên khi người dùng rời khỏi nó. Làm thế nào tôi có thể trả về trạng thái mặc định của nó. Cảm ơn!Làm mới vị trí cuộn của UITextView trên iPhone

+0

Là một lưu ý, tôi đã cố gắng để sử dụng [myTextView scrollRangeToVisible: NSMakeRange ([myTextView.text dài], 0)]; –

Trả lời

27

Theo trạng thái mặc định, bạn có muốn cuộn lên đầu không? Nếu vậy, bạn đang đi đúng hướng. Hãy thử

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

Tôi cũng đã thử nó, nhưng nó dường như không đi đến phần đầu của văn bản. Nó chỉ nhận được gần đầu, nhưng không giống như mặc định. Thành thật mà nói, tôi không thực sự hiểu rõ về công cụ của NSRange. –

+0

Tôi vừa thử với một ứng dụng tôi có, và nó hoạt động cho tôi. Bạn có thể đăng ảnh chụp màn hình của trình mô phỏng để chúng tôi có thể xem hành vi không? –

+0

Dưới đây là một số screencaps: INITIAL, SCROLLED DOWN MANUALLY, & RELOADED http://www.angelfilm.net/external/stackoverflow/mos/ –

8

Tôi thấy rằng nếu tôi xóa UITextView trước và sau đó áp dụng văn bản mới, nó sẽ tự động "cuộn" trở lại trên cùng.

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

Không một phương pháp nào trong số này phù hợp với tôi.

  • scrollRangeToVisible sản xuất tấn hiện vật trực quan (nhiều di chuyển khi chuyển đổi giữa các chuỗi lớn), và trong thực tế chỉ hoạt động ở tất cả trong một cuộc gọi chậm một thời gian (tôi đã sử dụng 0,1 giây) sau khi các nội dung đã được thay đổi, không trực tiếp như câu trả lời của Shaggy Frog ngụ ý.

  • đặt văn bản thành @ "" trước khi đặt nội dung mới không có tác dụng, ngay cả khi trì hoãn.

Dường như nếu một lần UITextView đã được nhập vào, nó sẽ mãi mãi ở chế độ này, nơi đặt nội dung mới gây ra hiện tượng cuộn gây phiền nhiễu. Tôi đã thử thiết lập selectionRange cho phần đầu của UITextView, nhưng điều đó không giúp được gì. Gửi tin nhắn resignFirstResponder trước khi thiết lập các nội dung mới cũng không giúp được gì.

Vì lý do này, tôi quyết định xóa và tạo lại UITextView mỗi khi tôi thay đổi nội dung. Đó là một sự kiện đủ hiếm (dựa trên tương tác của con người) trong ứng dụng của tôi rằng nó không phải là một vấn đề hiệu suất. Đó là cách duy nhất tôi có thể tìm thấy để "tải nội dung mới" vào UITextView mà không cần tấn các đồ tạo tác cuộn gây phiền nhiễu.

Kinh nghiệm của tôi là với OS3.2 (ipad simulator)

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

Tôi thực sự muốn dừng textView khỏi cuộn khi cập nhật nội dung , vì vậy tôi chỉ làm theo cách khác và nó hoạt động hoàn hảo. Cảm ơn bạn. – soemarko

1

tôi quản lý để có được kết quả mong muốn - buộc UITextView để 'cuộn' lên đỉnh nội dung của nó khi chỉnh sửa kết thúc. Nhưng để đạt được nó, tôi đã có cả hai di chuyển vô hiệu hóa trong textViewDidEndEditing VÀ CSONG thiết lập lại văn bản trong cùng một phương pháp.

Tôi bật lại cuộn trong textViewDidBeginChỉnh sửa.

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

này hoạt động nếu bạn muốn nó di chuyển lên đến đỉnh:

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

Vấn đề duy nhất là điều này làm sinh động theo cách của mình lên. Nếu bạn muốn nó chụp ở trên cùng, hãy sử dụng điều này:

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

Giải pháp này phù hợp với tôi. Tôi đã tải văn bản trong viewDidLoad, đã thay đổi ContentInset của UITextView và sau đó phải sử dụng scrollRectToVisible để có được đầu để căn chỉnh đúng cách. Cảm ơn – TMilligan

0

Điều cuối cùng cũng giúp tôi xóa nội dung văn bản và đặt văn bản mong muốn trên vòng chạy tiếp theo.

// 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 
} 
Các vấn đề liên quan