Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITextPosition to Int

I have a UISearchBar on which I am trying to set a cursor position. I am using UITectField delegates as I couldn't find anything direct for UISearchBar. Below is the code I am using:

  UITextField *textField = [searchBar valueForKey: @"_searchField"];
  // Get current selected range , this example assumes is an insertion point or empty selection
  UITextRange *selectedRange = [textField selectedTextRange];
  // Construct a new range using the object that adopts the UITextInput, our textfield
  UITextRange *newRange = [textField textRangeFromPosition:selectedRange.start toPosition:selectedRange.end];

Question is in the 'newRange' object for 'toPosition' I want to have something like selectedRange.end-1; as I want the cursor to be on second last position.

How do I set the cursor to second last position?

like image 380
tech_human Avatar asked Oct 14 '13 21:10

tech_human


2 Answers

Swift 5

I came across this question originally because I was wondering how to convert UITextPosition to an Int (based on your title). So that is what I will answer here.

You can get an Int for the current text position like this:

if let selectedRange = textField.selectedTextRange {
    // cursorPosition is an Int
    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
}

Note: The properties and functions used above are available on types that implement the UITextInput protocol so if textView was a UITextView object, you could replace the instances of textField with textView and it would work similarly.

For setting the cursor position and other related tasks, see my fuller answer.

like image 193
Suragch Avatar answered Nov 12 '22 09:11

Suragch


the clue is to make a position and then a range with no length and then select it

e.g.

- (IBAction)select:(id)sender {
    //get position: go from end 1 to the left
    UITextPosition *pos = [_textField positionFromPosition:_textField.endOfDocument
                                               inDirection:UITextLayoutDirectionLeft
                                                    offset:1];

    //make a 0 length range at position
    UITextRange *newRange = [_textField textRangeFromPosition:pos
                                                toPosition:pos];

    //select it to move cursor
    _textField.selectedTextRange = newRange;
}
like image 23
Daij-Djan Avatar answered Nov 12 '22 08:11

Daij-Djan