2009-03-06 16 views
23

Abbiamo una UITextView nella nostra app per iPhone che è modificabile. Abbiamo bisogno di inserire del testo nella posizione del cursore quando gli utenti premono alcuni pulsanti della barra degli strumenti ma non riesco a trovare un metodo documentato (o non documentato) per trovare la posizione corrente del cursore.Ottenere la posizione del cursore in una UITextView su iPhone?

Qualcuno ha qualche idea o qualcun altro ha ottenuto qualcosa di simile?

+0

Di nota è che textField.selectedRange.location non restituirà il percorso se richiesto in textViewDidBeginEditing: textField a meno che non lo si ottenga dopo un ritardo. – Morkrom

risposta

8

Hai provato UITextView.selectedRange? Restituisce un NSRange, il cui elemento di posizione dovrebbe dirti dove si trova il cursore.

30

Come ha detto drewh, è possibile utilizzare UITextView's selectedRange per restituire il punto di inserimento. La lunghezza di questo intervallo è sempre zero. L'esempio sotto mostra come farlo.

NSString *contentsToAdd = @"some string"; 
NSRange cursorPosition = [tf selectedRange]; 
NSMutableString *tfContent = [[NSMutableString alloc] initWithString:[tf text]]; 
[tfContent insertString:contentsToAdd atIndex:cursorPosition.location]; 
[theTextField setText:tfContent]; 
[tfContent release]; 
+6

Nota che con iPhone 3.0, non è più vero che la lunghezza dell'intervallo è sempre zero. Se l'utente ha selezionato il testo, la lunghezza sarà diversa da zero. In questo caso, potresti voler utilizzare replaceCharactersInRange: withString: invece di insertString :: atIndex :. Dovresti anche impostare la nuova gamma di selezione in modo appropriato. –

+0

Questo è ottimo, ma quando lo faccio, il cursore dell'utente viene lanciato alla fine di UITextView. Come posso mantenere il cursore dell'utente in posizione? – Jason

+2

Jason, prova tf.selectedRange = NSMakeRange (posizione_posizionamento cursore + contenutoToAdd.length, 0); dopo aver impostato il nuovo testo – demosten

10

Usa UITextView selectedRange proprietà per trovare il punto di inserimento quando la vista del testo è il primo responder. In caso contrario, quando la vista non è a fuoco, questa proprietà restituisce NSNotFound. Se è necessario conoscere la posizione del cursore in questo caso, considerare la sottoclasse UITextView e sostituire il metodo canResignFirstResponder, in cui è possibile memorizzare la posizione del cursore su una variabile membro.

+0

Questa è un'ottima informazione che è facile perdere. Non riesco a dirti quanto tempo ci è voluto per capire perché il selectedRange.location stava restituendo NSNotFound. È possibile verificare la posizione non valida con: if (myTextField.selectedRange.location == NSNotFound) – memmons

+0

Hai risolto la mia vita! Ma ora mi chiedo, cosa significa 'selectedTextRange'? Ho sempre l'inizio di tutto il testo quando lo utilizzo ... –

1

Swift 4:

// lets be safe, thus if-let 
if let cursorPosition = textView.selectedTextRange?.start { 
    // cursorPosition is a UITextPosition object describing position in the text 

    // if you want to know its position in textView in points: 
    let caretPositionRect = textView.caretRect(for: cursorPosition) 
} 

Usiamo semplicemente textView.selectedTextRange ad essere selezionato gamma di testo e la posizione del cursore è nella sua posizione di start.

Problemi correlati