2009-03-06 43 views
23

Chúng tôi có UITextView trong ứng dụng iPhone có thể chỉnh sửa. Chúng ta cần chèn một số văn bản tại vị trí con trỏ khi người dùng nhấn một số nút trên thanh công cụ nhưng dường như không thể tìm thấy phương pháp được ghi lại (hoặc không có giấy tờ) của vị trí hiện tại của con trỏ.Nhận vị trí con trỏ trong UITextView trên iPhone?

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

+0

Lưu ý rằng textField.selectedRange.location sẽ không trả lại vị trí nếu được yêu cầu trong textViewDidBeginEditing: textField trừ khi bạn nhận được nó sau khi trì hoãn. – Morkrom

Trả lời

8

Bạn đã thử UITextView.selectedRange chưa? Nó trả về một số NSRange, có phần tử vị trí sẽ cho bạn biết vị trí của con trỏ.

30

Giống như drewh đã nói, bạn có thể sử dụng lựa chọn Range của UITextView để trả về điểm chèn. Độ dài của dải này luôn bằng không. Ví dụ bên dưới cho thấy cách thực hiện.

NSString *contentsToAdd = @"some string"; 
NSRange cursorPosition = [tf selectedRange]; 
NSMutableString *tfContent = [[NSMutableString alloc] initWithString:[tf text]]; 
[tfContent insertString:contentsToAdd atIndex:cursorPosition.location]; 
[theTextField setText:tfContent]; 
[tfContent release]; 
+6

Lưu ý rằng với iPhone 3.0, nó không còn đúng là độ dài của phạm vi luôn bằng không. Nếu người dùng có văn bản được chọn, thì độ dài sẽ không khác. Trong trường hợp này, bạn có thể muốn sử dụng replaceCharactersInRange: withString: thay vì insertString :: atIndex :. Bạn cũng nên đặt phạm vi lựa chọn mới một cách thích hợp. –

+0

Điều này thật tuyệt - nhưng khi tôi thực hiện điều này, con trỏ của người dùng sẽ bị ném vào cuối UITextView. Làm cách nào để giữ con trỏ của người dùng? – Jason

+2

Jason, hãy thử tf.selectedRange = NSMakeRange (cursorPosition.location + contentsToAdd.length, 0); sau khi bạn đặt văn bản mới – demosten

10

Sử dụng thuộc tính UITextView selectedRange để tìm điểm chèn khi chế độ xem văn bản được trả lời trước. Nếu không, khi chế độ xem không được lấy nét, thuộc tính này sẽ trả lại NSNotFound. Nếu bạn cần biết vị trí con trỏ trong trường hợp đó, hãy xem xét phân lớp UITextView và ghi đè phương thức canResignFirstResponder, nơi bạn có thể lưu trữ vị trí con trỏ vào biến thành viên.

+0

Đây là thông tin tuyệt vời dễ bỏ lỡ. Tôi không thể cho bạn biết phải mất bao lâu để tôi tìm ra lý do tại sao selectedRange.location đã trả về NSNotFound. Bạn có thể kiểm tra vị trí không hợp lệ với: nếu (myTextField.selectedRange.location == NSNotFound) – memmons

+0

Bạn đã giải quyết được cuộc sống của mình! Nhưng bây giờ tôi tự hỏi, 'selectedTextRange' có nghĩa là gì? Tôi luôn luôn có được sự khởi đầu của toàn bộ văn bản khi sử dụng nó ... –

1

Swift 4:

// lets be safe, thus if-let 
if let cursorPosition = textView.selectedTextRange?.start { 
    // cursorPosition is a UITextPosition object describing position in the text 

    // if you want to know its position in textView in points: 
    let caretPositionRect = textView.caretRect(for: cursorPosition) 
} 

Chúng tôi chỉ đơn giản là sử dụng textView.selectedTextRange để chọn phạm vi văn bản và vị trí con trỏ đang ở vị trí start của nó.

Các vấn đề liên quan