Search code examples
iphoneipaduitextviewtext-cursor

Move Cursor One Word at a Time in UTextView


I would like to create a button that moves the cursor position in a UITextView one word at a time. From a user perspective, this would be the same as Option-Right Arrow in Mac OS X, which is defined as "go to the word to the right of the insertion point."

I have found a couple ways to move on character at a time. How would you modify this to move one word at a time?

- (IBAction)rightArrowButtonPressed:(id)sender
{
     myTextView.selectedRange = NSMakeRange(myTextView.selectedRange.location + 1, 0); 
}

Thanks for any suggestions.


Solution

  • Was able to implement it like this,

    - (IBAction)nextWord {
        NSRange selectedRange = self.textView.selectedRange;
        NSInteger currentLocation = selectedRange.location + selectedRange.length;
        NSInteger textLength = [self.textView.text length];
    
        if ( currentLocation == textLength ) {
            return;
        }
    
        NSRange newRange = [self.textView.text rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]
                                                               options:NSCaseInsensitiveSearch
                                                                 range:NSMakeRange((currentLocation + 1), (textLength - 1 - currentLocation))];
        if ( newRange.location != NSNotFound ) {
            self.textView.selectedRange = NSMakeRange(newRange.location, 0);
        } else {
            self.textView.selectedRange = NSMakeRange(textLength, 0);
        }
    }
    
    - (IBAction)previousWord {
        NSRange selectedRange = self.textView.selectedRange;
        NSInteger currentLocation = selectedRange.location;
    
        if ( currentLocation == 0 ) {
            return;
        }
    
        NSRange newRange = [self.textView.text rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]
                                                               options:NSBackwardsSearch
                                                                 range:NSMakeRange(0, (currentLocation - 1))];
        if ( newRange.location != NSNotFound ) {
            self.textView.selectedRange = NSMakeRange((newRange.location + 1), 0);
        } else {
            self.textView.selectedRange = NSMakeRange(0, 0);
        }
    
    }