iOS Obtenir et définir la position du curseur


Exemple

Informations utiles

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

let startPosition: UITextPosition = textView.beginningOfDocument

La fin du texte du champ de texte:

let endPosition: UITextPosition = textView.endOfDocument

La gamme actuellement sélectionnée:

let selectedRange: UITextRange? = textView.selectedTextRange

Obtenir la position du curseur

if let selectedRange = textView.selectedTextRange {
    
    let cursorPosition = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: selectedRange.start)
    
    print("\(cursorPosition)")
}

Définir la position du curseur

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

Au début

let newPosition = textView.beginningOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)

Jusqu'à la fin

let newPosition = textView.endOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)

À une position à gauche de la position actuelle du curseur

// only if there is a currently selected range
if let selectedRange = textView.selectedTextRange {
    
    // and only if the new position is valid
    if let newPosition = textView.positionFromPosition(selectedRange.start, inDirection: UITextLayoutDirection.Left, offset: 1) {
        
        // set the new position
        textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: 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 = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {
    
    textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
}

en relation

Sélectionner tout le texte

textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.endOfDocument)

Sélectionnez une plage de texte

// Range: 3 to 7
let startPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 3)
let endPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 7)

if startPosition != nil && endPosition != nil {
    textView.selectedTextRange = textView.textRangeFromPosition(startPosition!, toPosition: endPosition!)
}

Insérer du texte à la position actuelle du curseur

textView.insertText("Hello")

Remarques

  • Cet exemple provient à l'origine d'une adaptation de cette réponse Stack Overflow .

  • Cette réponse utilise un champ de texte, mais les mêmes concepts s'appliquent à UITextView .

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

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

en relation

  • Comment créer une plage dans Swift (traite indirectement de la question de savoir pourquoi nous devons utiliser selectedTextRange ici plutôt que de simplement selectedRange )