2016-01-21 18 views
43

Ich habe mit UITextField experimentiert und wie man mit seiner Cursorposition arbeitet. Ich habe eine Reihe von Beziehung Objective-C Antworten, wie sie inCursorposition von UITextField und UITextView in Swift abrufen und einstellen

Aber da ich mit Swift arbeite gefunden, ich wollte lernen, wie man Holen Sie sich den aktuellen Cursor und setzen Sie ihn in Swift.

Die folgende Antwort ist das Ergebnis meiner Experimente und Übersetzungen von Objective-C.

Antwort

136

Diese Antwort wurde für Swift aktualisiert 3

Folgende Inhalte sowohl auf UITextField und UITextView gilt.

Nützliche Informationen

Der Anfang des Textes Textfeld:

let startPosition: UITextPosition = textField.beginningOfDocument 

Das Ende des Textes Textfeld:

let endPosition: UITextPosition = textField.endOfDocument 

Der aktuell ausgewählte Bereich:

let selectedRange: UITextRange? = textField.selectedTextRange 

Get Cursorposition

if let selectedRange = textField.selectedTextRange { 

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

    print("\(cursorPosition)") 
} 

Set Cursorposition

Um die Position zu setzen, alle diese Methoden setzen tatsächlich eine Reihe mit den gleichen Anfangs- und Endwert.

Zu Anfang

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

Zum Ende

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

um eine Position nach 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) 
    } 
} 

In eine beliebige 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) 
} 

Verwandte

den gesamten Text auswählen

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

Wählen Sie einen Textbereich

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

Einfügen von Text an der aktuellen Cursor positio n

textField.insertText("Hello") 

Hinweise

  • Verwenden textField.becomeFirstResponder() Fokus auf das Textfeld zu geben und machen die Tastatur erscheinen.

  • Siehe this answer für, wie Sie den Text in einem bestimmten Bereich erhalten.

Siehe auch

+0

Was ist der Zweck von startPosition? Was kannst du damit machen? Was ist auch der Zweck, den man braucht, um die Cursorposition zu bekommen? – Honey

+1

@Honey, ich habe diesen Variablennamen verwendet, um hier auf zwei verschiedene Dinge zu verweisen. Der erste sollte sich auf den Anfang des Textfelds beziehen. Es wäre nützlich, wenn Sie den Cursor dorthin bewegen möchten. Die zweite sollte sich auf das Betteln eines ausgewählten Textes beziehen. Es ist nützlich, wenn Sie diesen Bereich kopieren oder ein Attribut festlegen möchten. – Suragch

+0

Gibt es etwas, um den Cursor nach rechts zu bewegen, während das Textfeld leer ist? Ich folgte deiner Antwort, aber ich konnte es nicht schaffen. –

2

in meinem Fall hatte ich DispatchQueue zu verwenden:

func textViewDidBeginEditing(_ textView: UITextView) { 

    DispatchQueue.main.async{ 
     textField.selectedTextRange = ... 
    } 
} 

nichts anderes aus diesem und anderen Themen gearbeitet.

PS: Ich habe überprüft, in welchem ​​Thread textViewDidBeginEditing lief, und es war Hauptthread, wie alle UI laufen sollte, also nicht sicher, warum diese kleine Verzögerung mit main.asynch funktioniert.

Verwandte Themen