2010-05-06 225 views
3

即時通訊在我的控制器中使用自定義鍵盤。但如何獲得uitextfiled中的光標位置。我的要求是在文本框的所需位置輸入文字。可能嗎?uitextfield中的光標位置

+0

可能重複http://stackoverflow.com/questions/1317929/insert-string-at-cursor-position-of-uitextfield – kennytm 2010-05-06 05:49:32

+0

沒有即時消息不問小數點。 – Allen 2010-05-06 06:07:54

+0

您可能不會詢問小數點,但您提出的問題是「如何在文本字段中的特定點處插入文本」。 KennyTM鏈接的問題包含一個非常好的和有用的解決方案。看一看。 – Jasarien 2010-08-23 12:14:18

回答

0

答案是,您無法獲得當前光標位置以進行可以使用文本字段進行的所有類型的編輯。您可以使用[textField粘貼]在光標處插入字符,但是用戶可以移動光標,選擇和修改文本,而無需在遊標結束的位置獲取通知。

您可以臨時粘貼一個特殊字符並在字符串中搜索其位置,將其刪除,然後添加您想要的字符。

+1

從iOS 5開始,'UITextField'符合'UITextInput'協議,所以使用它的'replaceRange:withText:'方法並結合獲得'selectedTextRange'將是更好的解決方案。 – omz 2013-01-30 00:21:31

1

讓我們假設你的代碼是在一個對象上的方法,其中self.textField是所討論的UITextField。

您可以找到光標/選擇與當前位置:

NSRange range = self.textField.selectedTextRange; 

如果用戶沒有選擇文本range.length將是0,這表明它僅僅是一個光標。不幸的是,這個屬性看起來並不符合KVO,所以當它發生變化時沒有有效的方式來通知,但是這不應該成爲你的情況的問題,因爲當你響應用戶與用戶的交互時,你可能真的只關心它您的自定義鍵盤。

然後您可以使用(假設newText持有來自您的自定義鍵盤的輸入)。

[self.textField replaceRange:range withText:newText]; 

如果您需要隨後調整光標/選擇,你可以使用:

self.textField.selectedTextRange = newRange; 

例如,您可能希望你插入的文本後,光標位置。

UPDATE:

在我原來的答案,我沒有注意到,我利用我已經加入到UITextView類別:

- (void)setSelectedRange:(NSRange)selectedRange 
{ 
    UITextPosition* from = [self positionFromPosition:self.beginningOfDocument offset:selectedRange.location]; 
    UITextPosition* to = [self positionFromPosition:from offset:selectedRange.length]; 
    self.selectedTextRange = [self textRangeFromPosition:from toPosition:to]; 
} 

- (NSRange)selectedRange 
{ 
    UITextRange* range = self.selectedTextRange; 
    NSInteger location = [self offsetFromPosition:self.beginningOfDocument toPosition:range.start]; 
    NSInteger length = [self offsetFromPosition:range.start toPosition:range.end]; 
    NSAssert(location >= 0, @"Location is valid."); 
    NSAssert(length >= 0, @"Length is valid."); 
    return NSMakeRange(location, length); 
} 

然後更換,而不是self.textField.selectedTextRange使用self.textField.selectedRange並繼續爲我描述。

感謝omz指出我的錯誤。

當然,你可以直接與UITextRange工作,但至少在我的情況下,這證明是相當不合理的。

+0

'selectedTextRange'不是'NSRange',它是'UITextRange'(它是一個類,而不是一個結構)。 – omz 2013-05-06 00:05:41

+0

很好!我忽略了我使用的類別。我已經更新了我的答案。 – idz 2013-05-06 05:57:47

0

斯威夫特

獲取光標所在位置:

if let selectedRange = textField.selectedTextRange { 
    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start) 
} 

在一些任意位置輸入文字:

let arbitraryValue: Int = 5 
if let newPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) { 

    textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition) 
    textField.insertText("Hello") 
} 

我完全的答案是here