2012-01-17 11 views
26

Ho un UITextView nella mia app per iPhone che è modificabile.Come impostare la posizione del cursore in UITextView

Nuovo pulsante viene creato all'interno di UITextView ogni volta che l'utente seleziona una funzione specifica.

Poiché il pulsante è sempre posizionato sul lato sinistro nella visualizzazione testo, è necessario posizionare il cursore sul lato destro del pulsante in modo che l'utente possa vedere ciò che sta digitando. Non riesco a trovare un metodo documentato (o non documentato) per impostare la posizione del cursore.

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

+0

Puoi pubblicare un immagine che spiega cosa stai cercando di fare? –

+0

Vorrei postarlo anche io ma sono nuovo qui. Reputazione inferiore a 10 non consente di pubblicare immagini. zzz – GURU

risposta

20
textView.editable = YES; 
textView.selectedRange = NSMakeRange(2, 0); 

Impostare la selectedRange ad una posizione con lunghezza pari a 0 e probabilmente anche voler TextView di essere modificabile in modo che anche impostare su YES.

+0

Ho provato questo, ma ancora non funziona. – GURU

3

cambiare selectedRange del tuo testo. per esempio per posizionare il cursore in posizione 3:

[textView setSelectedRange:NSMakeRange(3, 0)];

Nel tuo caso, ha aggiunto alcuni spazi sui contenuti TextView potrebbe aiuta. e osservatore textview 's textDidChanged event per evitare che questi spazi vengano cancellati dall'utente.

+0

Ho inserito questo codice in textViewDidBeginEditing ma non funziona. La posizione del cursore nella vista testo è ancora sul lato sinistro. – GURU

+0

non ha contenuto all'interno di TextView? aggiunto degli spazi prima di impostare la posizione del cursore. – xhan

50

So che questo è MOLTO in ritardo, ma ho pensato di poter aiutare le persone bloccate in questo (come me).

La performSelector:withObject:afterDelay sembra funzionare bene (le altre risposte semplicemente non avrebbe funzionato per qualche strano motivo):

- (void)textViewDidBeginEditing:(UITextView *)inView 
{ 
[self performSelector:@selector(setCursorToBeginning:) withObject:inView afterDelay:0.01]; 
} 

- (void)setCursorToBeginning:(UITextView *)inView 
{ 
//you can change first parameter in NSMakeRange to wherever you want the cursor to move 
inView.selectedRange = NSMakeRange(3, 0); 
} 

fonte: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

+1

Grazie, mi hai aiutato! – Guerrix

+0

:) nessun problema! Felice di aiutare! – Cashew

+0

Grazie mille! - Risposta perfetta. –

15

provare qualcosa di simile:

dispatch_async(dispatch_get_main_queue(), ^{ 
    inView.selectedRange = NSMakeRange(3, 0); 
}); 

Ciò causerà l'esecuzione di selectedRange sul thread principale all'inizio del successivo runloop.

+2

Perfetto senza indugio! +1 –

+0

Lavora per me alla prima volta! +1 –

0

Se si desidera che Texview sia richiesto o facoltativo come me. Vedi il mio mod

func textViewDidBeginEditing(textView: UITextView) { 
     if textView.text.isEmpty { 
      if self.text == "Required" || self.text == "Optional" { 
      dispatch_async(dispatch_get_main_queue(), { 
       textView.selectedRange = NSMakeRange(0, 0) 
      }); 
      } 
     } 
     } 

     func textViewDidEndEditing(textView: UITextView) { 
     if CommonUtils.isEmptyString(textView.text) { 
      if required { 
      textView.text = "Required" 
      } else { 
      textView.text = "Optional" 
      } 
      textView.textColor = grayColor// 
     } 
     } 

     func textViewDidChange(textView: UITextView) { 
     if textView.text.isEmpty { 
      if required { 
      textView.text = "Required" 
      } else { 
      textView.text = "Optional" 
      } 
      textView.textColor = grayColor 
      textView.selectedRange = NSMakeRange(0, 0) 
     } else { 
      if required { 
      if textView.text.length > "Required".length { 
       textView.text = self.text.replace("Required", withString: "") 
      } 
      } else { 
      if textView.text.length > "Optional".length { 
       textView.text = self.text.replace("Optional", withString: "") 
      } 
      } 
      textView.textColor = blackColor// 
     } 
     } 

Non dimenticate di registrare delegato: UITextViewDelegate

+0

La domanda non riguarda il segnaposto. Risposta irrevocabile –

0

utilizzare il seguente per raggiungere l'inizio della textView, utilizzando Swift 4:

DispatchQueue.main.async { 
    self.selectedTextRange = self.textRange(from: self.beginningOfDocument, to: self.beginningOfDocument) 
} 
Problemi correlati