iosios7uitextview

textview - put cursor at end of text when start editing


I am editing text in a UITextView. When the field opens for editing I need the cursor to be positioned after the final character of the existing text. The behavior I see is that the cursor is positioned more or less under the point where I touch the UITextView to start editing -- perhaps at the end of the word I touch on. I have tried setting the textview.selectedRange in both textViewDidBeginEditing: and textViewShouldBeginEditing: but that had no effect at all. I tried selecting ranges of the existing text, like {1,2} and that didn't do anything either. It seems like the selectedRange is more-or-less a read-only value?

- (void) textViewDidBeginEditing:(UITextView *)textView {
    // Position the insertion cursor at the end of any existing text
    NSRange insertionPoint = NSMakeRange([textView.text length], 0);
    textView.selectedRange = insertionPoint;
}

How do I get the cursor to the end of the text?


Solution

  • The post referred to by the comment by artud2000 contains a working answer. To summarize here, add:

    EDIT: The original answer was not sufficient. I've added toggling the editable property which seems to be sufficient. The problem is that the tap gesture only goes to the handler a single time (at most) and subsequent taps on the UITextField start editing directly. If it isn't editable then the UITextView's gesture recognizers are not active and the one I placed will work. This may well not be a good solution but it does seem to work.

    - (void)viewDidLoad {
    ...
        tapDescription = [[UITapGestureRecognizer alloc] 
            initWithTarget:self action:@selector(tapDescription:)];
        [self.descriptionTextView addGestureRecognizer:tapDescription];
        self.descriptionTextView.editable = NO;  // if not set in storyboard
    }
    
    - (void) tapDescription:(UIGestureRecognizer *)gr {
        self.descriptionTextView.editable = YES;
        [self.descriptionTextView becomeFirstResponder];
    }
    
    - (void) textViewDidEndEditing:(UITextView *)textView {
        //whatever else you need to do
        textView.editable = NO;
    }
    

    The default position of the cursor seems to be after any existing text which solved my problem, but if you want to you can select the text in textViewDidBeginEditing: by setting the selectedRange -- for instance:

    - (void) textViewDidBeginEditing:(UITextView *)textView {
        // Example: to select the second and third characters when editing starts...
        NSRange insertionPoint = NSMakeRange(1, 2);
        textView.selectedRange = insertionPoint;
    }