Le contenu suivant s'applique à 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 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)")
}
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)
Jusqu'à la fin
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
Vers 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)
}
}
Vers 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)
}
en relation
Sélectionnez 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
Voir également
textField.endOfDocument
. Vous pouvez également utiliser des traits de soulignement ou des espaces pour représenter les lettres manquantes.dans mon cas, j'ai dû utiliser DispatchQueue:
rien d'autre de cela et d'autres fils n'a fonctionné.
PS: J'ai vérifié à nouveau sur quel thread textViewDidBeginEditing s'exécutait, et c'était le thread principal, car toute l'interface utilisateur devrait fonctionner, donc je ne sais pas pourquoi ce petit retard d'utilisation de main.asynch a fonctionné.
la source
textViewDidBeginEditing
. Donc, en le plaçant dans la file d'attente, cela se produira une fois que l'appelant aura terminé.Pour définir la position du curseur à votre point:
Pour réinitialiser la position du curseur:
Remarque : cet exemple fonctionne à la fois dans Textview et Textfield.
la source
la source