web-dev-qa-db-fra.com

Obtention et définition de la position du curseur de UITextField et UITextView dans Swift

J'ai expérimenté avec UITextField et comment utiliser la position du curseur. J'ai trouvé un certain nombre de relations relation Objective-C, comme dans

Mais depuis que je travaille avec Swift, je voulais apprendre à obtenir l’emplacement actuel du curseur et à le définir dans Swift.

La réponse ci-dessous est le résultat de mon expérience et de ma traduction d'Objective-C.

89
Suragch

Le contenu suivant concerne à la fois UITextField et UITextView.

Informations utiles

Le tout début du texte du champ de texte:

let startPosition: UITextPosition = textField.beginningOfDocument

La toute fin du texte du champ de texte:

let endPosition: UITextPosition = textField.endOfDocument

La gamme actuellement sélectionnée:

let selectedRange: UITextRange? = textField.selectedTextRange

Obtenir la position du curseur

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)

    print("\(cursorPosition)")
}

Définir la position du curseur

Afin de définir la position, toutes ces méthodes définissent en fait une plage avec les mêmes valeurs de début et de fin.

Au début

let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

À la fin

let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

À une position à gauche de la position actuelle du curseur

// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {

    // and only if the new position is valid
    if let newPosition = textField.position(from: selectedRange.start, offset: -1) {

        // set the new position
        textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
    }
}

À une position arbitraire

Commencez par le début et déplacez 5 caractères vers la droite.

let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}

Apparenté, relié, connexe

Sélectionner tout le texte

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)

Sélectionnez une plage de texte

// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)

if startPosition != nil && endPosition != nil {
    textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}

Insérer du texte à la position actuelle du curseur

textField.insertText("Hello")

Remarques

  • Utilisez textField.becomeFirstResponder() pour mettre en évidence le champ de texte et faire apparaître le clavier.

  • Voir cette réponse pour savoir comment obtenir le texte à une certaine distance.

Voir également

257
Suragch

dans mon cas, je devais utiliser DispatchQueue:

func textViewDidBeginEditing(_ textView: UITextView) {

   DispatchQueue.main.async{
      textField.selectedTextRange = ...
   }
}

rien d'autre de cela et d'autres threads n'a fonctionné.

PS: J'ai vérifié deux fois sur quel thread textViewDidBeginEditing était en cours d'exécution. Il s'agissait du fil principal, car toute l'interface utilisateur devait être exécutée.

25
Michael Ros
let range = field.selectedTextRange

field.text = "hello world"

field.selectedTextRange = range 
1
Ivan

Pour définir la position du curseur à votre point:

textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))

Pour réinitialiser la position du curseur:

textView.endFloatingCursor()

Note: Cet exemple fonctionne à la fois dans Textview et Textfield.

1
Parth Patel