2012-01-17 44 views
26

Tôi có UITextView trong ứng dụng iPhone có thể chỉnh sửa được.Cách đặt vị trí con trỏ trong UITextView

Nút mới được tạo bên trong UITextView bất cứ khi nào người dùng chọn một chức năng cụ thể.

Vì nút luôn được đặt ở phía bên trái trong chế độ xem văn bản, tôi cần định vị con trỏ ở bên phải của nút để người dùng có thể xem nội dung họ đang nhập. Tôi dường như không thể tìm thấy phương thức được tài liệu (hoặc không có giấy tờ) để đặt vị trí của con trỏ.

Có ai có ý tưởng nào hoặc có ai khác đạt được điều gì tương tự không?

+0

Bạn có thể gửi một hình ảnh giải thích những gì bạn đang cố gắng để làm gì? –

+0

tôi cũng muốn đăng nó nhưng tôi mới đăng ở đây. Danh tiếng dưới 10 không cho phép đăng hình ảnh. zzz – GURU

Trả lời

20
textView.editable = YES; 
textView.selectedRange = NSMakeRange(2, 0); 

Đặt giá trị được chọnThay đổi đến vị trí có độ dài bằng 0 và bạn cũng có thể muốn TextView có thể chỉnh sửa, do đó cũng đặt thành YES.

+0

Tôi đã thử cách này nhưng vẫn không hoạt động. – GURU

3

thay đổi selectedRange của TextView của bạn. ví dụ để đặt con trỏ ở vị trí 3:

[textView setSelectedRange:NSMakeRange(3, 0)];

Trong trường hợp của bạn, thêm một số không gian về nội dung TextView sức mạnh giúp. và người quan sát textview 's textDidChanged event để ngăn chặn những không gian này sẽ bị xóa bởi người dùng.

+0

Tôi đã chèn mã này trong textViewDidBeginChỉnh sửa nhưng nó không hoạt động. Vị trí của con trỏ trong chế độ xem văn bản vẫn đang ở bên trái. – GURU

+0

không có nội dung bên trong textView của bạn? đã thêm một số dấu cách trước khi đặt vị trí con trỏ. – xhan

50

Tôi biết điều này là RẤT muộn, nhưng tôi nghĩ rằng tôi có thể giúp mọi người bị mắc kẹt trong này (như tôi).

Các performSelector:withObject:afterDelay dường như làm việc tốt (các câu trả lời khác chỉ sẽ không làm việc vì một lý do lạ):

- (void)textViewDidBeginEditing:(UITextView *)inView 
{ 
[self performSelector:@selector(setCursorToBeginning:) withObject:inView afterDelay:0.01]; 
} 

- (void)setCursorToBeginning:(UITextView *)inView 
{ 
//you can change first parameter in NSMakeRange to wherever you want the cursor to move 
inView.selectedRange = NSMakeRange(3, 0); 
} 

nguồn: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

+1

Cảm ơn, bạn đã giúp tôi! – Guerrix

+0

:) không sao cả! Vui mừng được giúp đỡ! – Cashew

+0

Cảm ơn rất nhiều! - Câu trả lời hoàn hảo. –

15

Hãy thử một cái gì đó như thế này:

dispatch_async(dispatch_get_main_queue(), ^{ 
    inView.selectedRange = NSMakeRange(3, 0); 
}); 

Điều này sẽ làm cho SelectedRange được thực hiện trên luồng chính ở đầu của vòng lặp tiếp theo.

+2

Hoàn hảo không chậm trễ! +1 –

+0

Làm việc cho tôi trong lần đầu tiên! +1 –

0

Nếu bạn muốn đặt phần giữ chỗ Texview là bắt buộc hoặc tùy chọn như tôi. Xem hack của tôi

func textViewDidBeginEditing(textView: UITextView) { 
     if textView.text.isEmpty { 
      if self.text == "Required" || self.text == "Optional" { 
      dispatch_async(dispatch_get_main_queue(), { 
       textView.selectedRange = NSMakeRange(0, 0) 
      }); 
      } 
     } 
     } 

     func textViewDidEndEditing(textView: UITextView) { 
     if CommonUtils.isEmptyString(textView.text) { 
      if required { 
      textView.text = "Required" 
      } else { 
      textView.text = "Optional" 
      } 
      textView.textColor = grayColor// 
     } 
     } 

     func textViewDidChange(textView: UITextView) { 
     if textView.text.isEmpty { 
      if required { 
      textView.text = "Required" 
      } else { 
      textView.text = "Optional" 
      } 
      textView.textColor = grayColor 
      textView.selectedRange = NSMakeRange(0, 0) 
     } else { 
      if required { 
      if textView.text.length > "Required".length { 
       textView.text = self.text.replace("Required", withString: "") 
      } 
      } else { 
      if textView.text.length > "Optional".length { 
       textView.text = self.text.replace("Optional", withString: "") 
      } 
      } 
      textView.textColor = blackColor// 
     } 
     } 

Dont quên đăng ký đại biểu: UITextViewDelegate

+0

Câu hỏi không phải là về trình giữ chỗ. Câu trả lời không phân biệt –

0

tôi sử dụng sau đây để có được sự khởi đầu của TextView, sử dụng Swift 4:

DispatchQueue.main.async { 
    self.selectedTextRange = self.textRange(from: self.beginningOfDocument, to: self.beginningOfDocument) 
} 
Các vấn đề liên quan