Reputation: 575
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
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
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
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
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
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
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