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
- obtenir la position du curseur D'UITextField dans ios
- position du curseur de contrôle dans UITextField
- UITextField obtenir actuellement édité mot
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.
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
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é.