2012-01-17 22 views
26

Tengo una UITextView en mi aplicación de iPhone que se puede editar.Cómo establecer la posición del cursor en UITextView

Se crea un nuevo botón dentro de UITextView cada vez que el usuario selecciona una función específica.

Como el botón siempre se coloca en el lado izquierdo en la vista de texto, necesito colocar el cursor en el lado derecho del botón para que el usuario pueda ver lo que están escribiendo. Parece que no puedo encontrar un método documentado (o no documentado) para establecer la ubicación del cursor.

¿Alguien tiene alguna idea o alguien más ha logrado algo similar?

+0

Se puede publicar una imagen que explica lo que estás tratando de hacer? –

+0

deseo publicarlo también, pero soy nuevo aquí. La reputación de menos de 10 no permite publicar imágenes. zzz – GURU

Respuesta

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

Establecer la selectedRange a un lugar con longitud de 0 y es probable que también quieren que el Textview a ser editable por lo que también estableció que a SÍ.

+0

Lo he intentado pero todavía no funciona. – GURU

3

cambio selectedRange de su textView. por ejemplo, para colocar el cursor en la posición 3:

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

En su caso, añadido algunos espacios en los contenidos Textview podría ayuda. y el observador textview 's textDidChanged event para evitar estos espacios será eliminado por el usuario.

+0

He insertado este código en textViewDidBeginEditing pero no está funcionando. La posición del cursor en la vista de texto sigue estando en el lado izquierdo. – GURU

+0

no hay contenido dentro de su textView? agregó algunos espacios antes de establecer la posición del cursor. – xhan

50

Sé que esto es MUY tarde, pero pensé que podría ayudar a las personas atrapadas en esto (como yo).

El performSelector:withObject:afterDelay parece funcionar bien (las otras respuestas simplemente no funcionarían por alguna extraña razón):

- (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); 
} 

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

+1

¡Gracias, me ayudaste! – Guerrix

+0

:) no hay problema! ¡Encantado de ayudar! – Cashew

+0

¡Muchas gracias! - Respuesta perfecta. –

15

intentar algo como esto:

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

Esto hará que selectedRange se ejecute en el hilo principal al comienzo del próximo runloop.

+2

¡Perfecto sin demora! +1 –

+0

¡Trabaja para mí en la primera vez! +1 –

0

Si desea hacer que el marcador de posición de Texview sea obligatorio u opcional como yo. Ver mi truco

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

No se olvide de registrar delegado: UITextViewDelegate

+0

La pregunta no se trata de un marcador de posición. Respuesta irrelevante –

0

Puedo usar el siguiente para llegar al inicio de la Textview, utilizando Swift 4:

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