2009-03-06 12 views
23

私たちのiPhoneアプリには編集可能なUITextViewがあります。ユーザーがいくつかのツールバーのボタンを押したときに、カーソルの位置にテキストを挿入する必要がありますが、カーソルの現在位置を見つけるための文書化された(または文書化されていない)方法が見つからないようです。iPhone上のUITextViewでカーソル位置を取得していますか?

誰か他のアイディアを持っているのですか?

+0

textField.selectedRange.locationは、遅延の後に取得しない限り、textViewDidBeginEditing:textFieldで要求された場合、位置を返しません。 – Morkrom

答えて

8

UITextView.selectedRangeを試しましたか? NSRangeを返します。その位置要素は、カーソルの位置を示します。

30

drewhさんのように、UITextViewのselectedRangeを使用して挿入ポイントを返すことができます。この範囲の長さは常にゼロです。下の例は、その方法を示しています。

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

iPhone 3.0では、範囲の長さが常にゼロであることはもはや真ではないことに注意してください。ユーザーがテキストを選択した場合、長さはゼロではありません。この場合、insertString :: atIndex:の代わりにreplaceCharactersInRange:withString:を使用することができます。新しい選択範囲も適切に設定する必要があります。 –

+0

これは素晴らしいことですが、これを行うと、ユーザーのカーソルがUITextViewの最後までスローされます。どのようにしてユーザーのカーソルを維持できますか? – Jason

+2

Jason、tf.selectedRange = NSMakeRange(cursorPosition.location + contentsToAdd.length、0);を試してください。あなたが新しいテキストを設定した後 – demosten

10

テキストビューはファーストレスポンダときに挿入ポイントを見つけるために、UITextView selectedRangeプロパティを使用します。それ以外の場合、ビューにフォーカスがない場合、このプロパティはNSNotFoundを返します。その場合にカーソル位置を知る必要がある場合は、UITextViewをサブクラス化し、カーソル位置をメンバ変数に格納できるcanResignFirstResponderメソッドをオーバーライドすることを検討してください。

+0

これは見逃しやすい素晴らしい情報です。私はselectedRange.locationがNSNotFoundを返す理由を把握するのにどれくらい時間がかかりましたか、あなたには言いません。 無効な場所を確認するには if(myTextField.selectedRange.location == NSNotFound) – memmons

+0

あなたは私の人生を解決しました!しかし、今私は、 'selectedTextRange'はどういう意味ですか?私はそれを使用すると、常にテキスト全体の先頭を取得... –

1

スウィフト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) 
} 

我々は、単にテキスト範囲とカーソル位置がそのstart位置にある選択を取得するためにtextView.selectedTextRangeを使用しています。

関連する問題