2

I have a UITextField in login page for password. when user selects a part of text in password, I want to get index of the selected text.

for example, if user enter '1234' in textfield and '23' is selected, I want to have index of '23'.

I don't want integer index. the output type of selected index should be "String.Index".

  • 2
    I hope this link is useful for your answer:https://stackoverflow.com/questions/34922331/getting-and-setting-cursor-position-of-uitextfield-and-uitextview-in-swift – Jay Jul 03 '17 at 07:40
  • you can use Range – Dhiru Jul 03 '17 at 07:45

1 Answers1

1

The function you wanted to get start and end index of selected text:

    extension UITextField {
        func selectedTextIndexes() -> (startIndex:String.Index,endIndex:String.Index)? {
            if let range = self.selectedTextRange {
                if !range.isEmpty {
                    let location = self.offset(from: self.beginningOfDocument, to: range.start)
                    let length = self.offset(from: range.start, to: range.end)

                    let startIndex = self.text!.index(self.text!.startIndex, offsetBy: location)
                    let endIndex = self.text!.index(startIndex, offsetBy: length)

                    return (startIndex,endIndex)
                }
            }
            return nil
        }
    }

How to use it:

   if let selectedTextIndexes = textField.selectedTextIndexes() {
       let startIndex = selectedTextIndexes.startIndex
       let endIndex = selectedTextIndexes.endIndex
       if let selectedText = textField.text?.substring(with: startIndex..<endIndex) {
           print(selectedText)
       }
   }
Yun CHEN
  • 6,450
  • 3
  • 30
  • 33