Sharief
Sharief

Reputation: 1485

Can I Programmatically Select Text in UITextView?

I want to select Text on UITextView, similar to the default "Select" and "Select All" pop options we see when we tap. I want to the user the ability to do that from my custom menu. I played with selectedRange but that doesnt seem to do the trick. Any ideas?

Thanks

Upvotes: 6

Views: 8817

Answers (3)

wildcat12
wildcat12

Reputation: 1010

I just do:

func textViewDidBeginEditing(_ textView: UITextView) {
    textView.selectAll(textView)
}

which seems to work pretty well, and adds a couple nice features IMO, like if you tap on the existing text, it selects it all; if you tap at the beginning or end of the text, it puts the cursor there without selecting all (which kinda seems natural).

Upvotes: 0

Hari Honor
Hari Honor

Reputation: 8914

As mentioned in the accepted answer, the selectedRange property is the thing you need, but beware that if you are using the -textViewDidBeginEditing: delegate method you might need to defer one run loop in order to win out over the user generated "insertion" action:

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    // Look for the default message and highlight it if present
    NSRange defaultMsgRange = [textView.text rangeOfString:NSLocalizedString(@"TEXTFIELD_DEFAULT_MESSAGE", nil) options:NSAnchoredSearch];

    BOOL isDefaultMsg = !(defaultMsgRange.location == NSNotFound && defaultMsgRange.length == 0);
    if (isDefaultMsg) {

        // Need to delay this by one run loop otherwise the insertion wins
        [self performBlock:^(id sender) {  // (BlocksKit - use GCD otherwise)

            textView.selectedRange = defaultMsgRange;

        } afterDelay:0.0];
    }
}

Upvotes: 5

Martin Cote
Martin Cote

Reputation: 29842

The selectedRange property should do it but, as mentioned in the documentation, only in iPhone OS 3.0 and later. In 2.2 and earlier, the selectedRange property is actually an insertion point.

Upvotes: 6

Related Questions