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.
Le contenu suivant concerne à la fois UITextField
et UITextView
.
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
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
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)
}
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")
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.
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.
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range
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.