ios - Abrufen und Festlegen der Cursorposition von UITextField und UITextView in Swift




uitextposition (3)

Ich habe mit UITextField experimentiert und wie man mit seiner Cursorposition arbeitet. Ich habe eine Reihe von Relationen gefunden, auf die Objective-C wie in geantwortet hat

Da ich aber mit Swift arbeite, wollte ich lernen, wie man die aktuelle Cursorposition ermittelt und auch in Swift einstellt.

Die Antwort unten ist das Ergebnis meiner Experimente und der Übersetzung von Objective-C.


Der folgende Inhalt gilt sowohl für UITextField als auch für UITextView .

Nützliche Informationen

Der Anfang des Textfeldes text:

let startPosition: UITextPosition = textField.beginningOfDocument

Das Ende des Textfeldes text:

let endPosition: UITextPosition = textField.endOfDocument

Der aktuell ausgewählte Bereich:

let selectedRange: UITextRange? = textField.selectedTextRange

Cursorposition abrufen

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)

    print("\(cursorPosition)")
}

Stellen Sie die Cursorposition ein

Um die Position festzulegen, legen alle diese Methoden tatsächlich einen Bereich mit den gleichen Start- und Endwerten fest.

Zu Beginn

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

Bis zum Ende

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

Um eine Position links von der aktuellen Cursorposition

// 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)
    }
}

Zu einer beliebigen Position

Beginnen Sie am Anfang und bewegen Sie 5 Zeichen nach rechts.

let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}

verbunden

Wählen Sie den gesamten Text aus

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

Wählen Sie einen Textbereich aus

// 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!)
}

Text an der aktuellen Cursorposition einfügen

textField.insertText("Hello")

Anmerkungen

  • Verwenden Sie textField.becomeFirstResponder() , um das Textfeld in den Fokus zu setzen und die Tastatur textField.becomeFirstResponder() .

  • In dieser Antwort erfahren Sie, wie Sie den Text in einem bestimmten Bereich abrufen können.

Siehe auch

  • So erstellen Sie einen Bereich in Swift

So stellen Sie die Cursorposition an Ihrem Punkt ein:

textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))

Zum Zurücksetzen der Cursorposition:

textView.endFloatingCursor()

Hinweis : Dieses Beispiel funktioniert sowohl in Textview als auch in Textfield.


let range = field.selectedTextRange

field.text = "hello world"

field.selectedTextRange = range 




uitextposition