web-dev-qa-db-ja.com

UITextViewでカーソルの位置を設定する方法

IPhoneアプリに編集可能なUITextViewがあります。

ユーザーが特定の機能を選択するたびに、UITextView内に新しいボタンが作成されます。

ボタンは常にテキストビューの左側に配置されるため、ユーザーが入力内容を確認できるように、ボタンの右側にカーソルを配置する必要があります。カーソルの位置を設定するための文書化された(または文書化されていない)メソッドを見つけることができないようです。

誰もアイデアを持っていますか、または他の誰かが同様のものを達成しましたか?

29
GURU

私はこれが非常に遅いことを知っていますが、私がこれに引っかかっている人を助けることができると思いました(私のように)。

performSelector:withObject:afterDelayはうまく機能しているようです(他の答えは、何らかの奇妙な理由で機能しません):

- (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); 
} 

ソース: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

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

SelectedRangeを長さ0の場所に設定し、おそらくtextViewも編集可能にする必要があるため、それもYESに設定します。

21
Evan

次のようなものを試してください:

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

これにより、次のランループの開始時に、選択された範囲がメインスレッドで実行されます。

17
acavanagh

Swift 4を使用して、次を使用してtextViewの先頭に移動します。

DispatchQueue.main.async {
    self.selectedTextRange = self.textRange(from: self.beginningOfDocument, to: self.beginningOfDocument)
}
5
blwinters

textViewのselectedRangeを変更します。たとえば、カーソルを位置3に配置するには:

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

あなたの場合、textViewの内容にスペースを追加すると役立つ場合があります。そしてオブザーバーtextview 's textDidChanged eventこれらのスペースを防ぐために、ユーザーによって削除されます。

3
xhan

Texviewプレースホルダーを作成する場合は、私のように必須またはオプションです。ハックを見る

 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//
        }
      }

デリゲートを登録することを忘れないでください:UITextViewDelegate

0
Rico Nguyen