2009-11-10 14 views
12

Mi problema es que la fijación de la programáticamente selectedRange de UITextView selecciona el texto, pero no se indicar visualmente que está seleccionado. ¿Esto suena como un error en OS 3.0/3.1. Más importante aún, ¿alguna solución o sugerencia para mostrar la selección? (proyecto de muestra vinculado en la parte inferior del mensaje)UITextView selectedRange no se muestra cuando se establece mediante programación

¿Cómo sé que está seleccionado porque no recibo una respuesta visual? dos razones:

  1. Sin cursor parpadeante
  2. Tapping cualquier tecla en el teclado se borrará el texto en el rango de selección existente.

Tengo un UITextView en un controlador de visualización que permite editar un valor modificable por el usuario. El controlador del editor se abre cuando se recibe un doble toque en una fila de la tabla, o el usuario toca el botón de divulgación de detalles en una fila. El viewcontroller llega a través de presentModalViewController, y en el editor de métodos viewWillAppear de VC, que iniciará el teclado con [self.textView becomeFirstResponder];

A veces quiero iniciar el editor con todo el contenido de la Vista de Texto seleccionado de manera que el usuario puede simplemente comenzar a escribir y sería elimine los contenidos existentes (esto es porque creo nuevos elementos con títulos predeterminados por lo que es casi seguro que el usuario borrará primero el contenido completo del campo de texto del editor, luego escriba su título).

Algunas de las cosas que he intentado ya:

  1. establecer el rango seleccionado en viewDidAppear (en lugar de y además de hacerlo en textViewDidBeginEditing).
  2. Reemplazando _textView.text con una copia del texto y luego aplicando el selectedRange (en textViewDidBeginEditing) ... pensando que tal vez si estoy lidiando con un error de framework, esto podría evitarlo.
  3. [[_textView webView] selectAll]; (api privado). mismo comportamiento, el texto se selecciona sin comentarios visuales.
  4. enviando _textView setNeedsDisplay y setNeedsLayout.
  5. utilizando un selector de rendimiento ... afterDelay para establecer el Rank seleccionado para que ocurra después de salir de textViewDidBeginEditing.

árbitros en S.O .:Here y here

// UITextFieldDelegate Methods... 
- (void)textViewDidBeginEditing:(UITextView *)_textView 
{ 
NSInteger len = [_textView.text length]; 

if(self.selectInitialText){ 
    //NOTE: this is not working as expected. Indeed the text is 
    // selected but the highlighting of the text isn't showing. 
    _textView.selectedRange = NSMakeRange(0,len); 
} 
} 

- EDITAR -
Aquí está el proyecto de ejemplo presentado a Apple bugreporter.Download BugReport_7380723 sample project

Información adicional:

Al crear y jugar con la presentación de proyecto de ejemplo, he descubierto dos cosas:

  • cuando hay texto seleccionado, pero aparece ningún punto culminante, toque algunas teclas y luego " agitar para deshacer "y el texto original se restaura pero IS resaltado.

  • Si realiza manualmente una selección en la Vista de Texto y después en el "Seleccionar todo" botón [se refiere al proyecto de ejemplo vinculado anteriormente], se selecciona todo el texto Y muestra lo más destacado correctamente.

Respuesta

0

Solución alternativa: Lo que parece querer es la funcionalidad del marcador de posición UITextView. Esto por supuesto no existe. Sin embargo, hay algunas soluciones here

+0

Gracias por la sugerencia de solución alternativa. Pero en realidad no es un marcador de posición en este caso. Tengo una entidad con un "título" editable específico; un marcador de posición desaparecería cuando el campo "se abra" para editarlo. Mi texto debe permanecer pero indica que está seleccionado y, por lo tanto, una acción del teclado reemplazará la selección, o necesitan tocar el campo para cancelar la selección. Además, un widget de cualquier clase que soporte selecciones, debe indicar el estado seleccionado, por lo que es probable que se trate de un error (he presentado un informe de error justo después de publicarlo aquí). Estoy más interesado en soluciones provisionales que muestran la selección. Gracias. – wkw

4

Voy a responder mi propia pregunta por el momento y actualizarla más tarde cuando haya más información (o si alguien encuentra una solución adecuada, con mucho gusto moveré el cheque a su respuesta) . Tengo un informe de error en Apple y después de enviar el código de muestra, está allí con el estado abierto. Estoy bastante seguro de que es un error, así que cuando reciba una respuesta de ellos, pasaré por aquí.

+2

¿Has vuelto a escuchar? :) – antsyawn

+0

¿Has vuelto a escuchar? – Legolas

+0

Estoy seleccionando la respuesta de @ Zac, ya que al menos otra persona parece haberlo confirmado, pero no he tenido oportunidad de probarlo. – wkw

16

Antes de configurar la selección mediante programación en textView, simplemente seleccione seleccionar para que se muestre visualmente la nueva selección. Por ejemplo:

[textView select:self]; 
textView.selectedRange = newSelectedRange; 
+0

esto funciona. invocando seleccionar antes de setSelectedRange hace visible el fondo azul y 'lollypops'. Omitir la llamada de selección dará como resultado texto seleccionado, pero sin los indicadores de selección –

1

De repente cumple esta pregunta. He tenido el mismo problema hasta que verifico el encabezado de declaración de NSObject. Ya han proporcionado una función llamada selectAll:

@interface NSObject(UIResponderStandardEditActions) // these methods are not implemented in NSObject 

- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2); 

@end 
Cuestiones relacionadas