Obtenir et définir la position du curseur de UITextField et UITextView dans Swift

j'ai expérimenté avec UITextField et comment travailler avec sa position de curseur. J'ai trouvé un certain nombre de relation Objective-C des réponses, comme dans

Mais puisque je travaille avec Swift, je voulais apprendre comment obtenir l'emplacement du curseur actuel et le configurer dans Swift.

la réponse ci-dessous est le résultat de mon expérimentation et de la traduction de L'objectif-C.

64
demandé sur Community 2016-01-21 14:16:56

2 réponses

cette réponse a été mise à jour pour Swift 3

le contenu suivant s'applique à la fois à UITextField et à UITextView .

informations utiles

Le début du texte du champ de texte:

let startPosition: UITextPosition = textField.beginningOfDocument

à La fin du texte du champ de texte:

let endPosition: UITextPosition = textField.endOfDocument

La plage 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)")
}

position du curseur

afin de définir la position, toutes ces méthodes sont en fait le réglage d'une plage avec les mêmes valeurs début et 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 ligne 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

commence au début et déplace 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)
}

lié

Sélectionner tout le texte

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

sélectionner une gamme de textes

// 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 texte à la position courante du curseur

textField.insertText("Hello")

Notes

  • utilisez textField.becomeFirstResponder() pour focaliser le champ de texte et faire apparaître le clavier.

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

Voir aussi

184
répondu Suragch 2017-10-04 09:01:37

dans mon cas, j'ai dû utiliser DispatchQueue:

func textViewDidBeginEditing(_ textView: UITextView) {

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

rien d'autre de ceci et d'autres fils travaillé.

PS: j'ai vérifié deux fois quel thread textViewDidBeginEditing était en cours d'exécution, et c'était le thread principal, car tout L'UI devrait être activé, donc je ne sais pas pourquoi ce petit retard en utilisant main.asynch a travaillé.

10
répondu Michael Ros 2017-11-23 23:52:59