GURU
GURU

Reputation: 575

How to set the position of the cursor in UITextView

I have an UITextView in my iPhone app which is editable.

New button is created inside the UITextView whenever user select a specific function.

As the button is always placed on the left side in the text view, I need to position the cursor on the right side of the button so that user can see what they are typing. I can't seem to find a documented (or undocumented) method to set location of the cursor.

Does anybody have any ideas or has anybody else achieved anything similar?

Upvotes: 33

Views: 39994

Answers (6)

blwinters
blwinters

Reputation: 2191

I use the following to get to the beginning of the textView, using Swift 4:

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

Upvotes: 12

Rico Nguyen
Rico Nguyen

Reputation: 401

If you want to make Texview placeholder is required or optional like me. See my hack

 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 forget to register delegate: UITextViewDelegate

Upvotes: 1

acavanagh
acavanagh

Reputation: 191

Try something like this:

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

This will cause selectedRange to be executed on the main thread at the beginning of the next runloop.

Upvotes: 19

Cashew
Cashew

Reputation: 1474

I know this is VERY late, but I thought I could help people stuck in this (like me).

The performSelector:withObject:afterDelay seems to work fine (the other answers just wouldn't work for some strange reason):

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

source: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

Upvotes: 55

xhan
xhan

Reputation: 6287

change selectedRange of your textView. for example to place cursor at position 3:

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

In your case, added some spaces on the textView contents might helps. and observer textview 's textDidChanged event to prevent these space will be deleted by user.

Upvotes: 4

Evan
Evan

Reputation: 6161

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

Set the selectedRange to a location with length of 0 and you probably also want the textView to be editable so also set that to YES.

Upvotes: 25

Related Questions