Detección de enlaces UITextView en iOS 7

Tengo un UITextView que se gestiona a través de Interface Builder. Como detección de datos, he marcado “Enlaces”. En iOS 6, todo funciona bien y los enlaces están resaltados y se puede hacer clic. Sin embargo, en iOS 7, todos los enlaces siguen siendo solo texto. Las casillas de verificación editables y seleccionables están desmarcadas.

Lo que puede ser motivo de preocupación es que UITextView es una subvista de una vista de contenedor que está de nuevo dentro de UIScrollView .

Parece que en iOS 7 la detección de enlaces solo funciona si se selecciona UITextView . Entonces, hacer que mi UITextView no se UITextView seleccionar detuvo la detección de enlaces para que no funcione.

También probé esto en iOS 6 y puedo confirmar que en iOS 6 la detección de enlace funciona bien incluso con el UITextView no seleccionable.

Estaba teniendo problemas con la detección del número de teléfono hoy. Parecía que UITextView retendría los números de teléfono antiguos y mantendría el texto resaltado después de haber configurado el texto en otra cosa.

Descubrí que si configuro texto: nulo antes de configurar el texto en la nueva cadena, restablecería la vista de texto y los números de teléfono se resaltarían de forma normal. Me pregunto si esto es algún tipo de error con UITextView en iOS 7.0

De cualquier manera, esto funcionó para mí.

Cuando iOS7 salió por primera vez, esto me atormentó y encontré una respuesta en este hilo (estableciendo el atributo de texto de UITextView en nil antes de establecer el valor real que hizo el truco). Entonces, de repente, el problema (para mí fue toda la cadena resaltada como un enlace) recortó la copia de seguridad (supuestamente debido a una actualización de iOS).

Lo que finalmente hizo el truco para mí fue dejar de usar el atributo de texto y establecer el texto atribuido. Una vez que hice esto, la necesidad de configurar las fonts / desplazamiento / seleccionable / editable / etc. programáticamente, desapareció. Definí mi UITextView en IB, establecí los valores como quería (no desplazables, no editables, seleccionables, detectando enlaces y números de teléfono) y luego construí una cadena atribuida y establecí:

 myUITextView.attributedString = myAttributedString; 

Y de repente todo funcionó como se esperaba. Espero que esto ayude a alguien más en el camino.

Tuve el mismo problema y deshabilitar el desplazamiento en el UITextView activa la detección de enlace en la carga en lugar de solo funcionar una vez que el usuario ha interactuado con la vista de texto. El UITextView también debe ser seleccionable y no editable.

 detailTextView.scrollEnabled = NO; detailTextView.editable = NO; detailTextView.selectable = YES; 

Ser seleccionable o tener scroll habilitado no es necesario en iOS6.

Otra cosa que debe verificar es que la interacción con el usuario está habilitada en la celda y en la vista de contenido de la celda, de lo contrario, no se podrá hacer clic en el enlace.

Compruebe que estas líneas se deben agregar para usar la propiedad del detector de datos de la textview de textview en la celda UItableView .

  txtvwMsgText.userInteractionEnabled = YES; txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink; txtvwMsgText.scrollEnabled = NO; txtvwMsgText.editable = NO; txtvwMsgText.selectable = YES; 

Debería verificar NSDataDetector .

Puede usar esto para buscar y tratar diferentes datos (enlaces, números de teléfono y más). Eche un vistazo en este sitio:

http://nshipster.com/nsdatadetector/

También puede usar la propiedad dataDetectorTypes de UITextView para configurar lo que desea detectar en el código. Puede ser un problema de transición del guión gráfico para ti.

 textView.dataDetectorTypes = UIDataDetectorTypeLink; 

Tenga en cuenta que su vista de texto solo reconocerá los enlaces si no son editables.

Aquí hay un buen tutorial sobre cómo hacer una editable UITextView con `link detection`

Editable UITextView con enlace detecion

No he tenido ningún problema con esa solución desde ahora.

El truco es un GestureRecognizer para tocar y activar / desactivar la edición.

Puede aplicar lo mismo con el problema selectable / not selectable en iOS7

Después de algunas pruebas, encontré la solución.

Si desea enlaces activos y no habilitará la selección, debe editar gestureRecognizers.

Por ejemplo, hay 3 LongPressGestureRecognizers. Uno para hacer clic en el enlace (minimumPressDuration = 0.12), el segundo para acercar el modo editable (minimumPressDuration = 0.5), el tercero para la selección (minimumPressDuration = 0.8). Esta solución elimina LongPressGestureRecognizer para seleccionar y segundo para ampliar el modo de edición.

 NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers; NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init]; for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) { if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) { [mutableArrayOfGestureRecognizers addObject:gestureRecognizer]; } else { UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer; if (longPressGestureRecognizer.minimumPressDuration < 0.3) { [mutableArrayOfGestureRecognizers addObject:gestureRecognizer]; } } } self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers; 

Probado en iOS 9, pero debería funcionar en todas las versiones (iOS 7, 8, 9). ¡Espero que ayude! 🙂

Encontré el truco, ¡esto funciona en iOS 7!

Debe configurar el UITextView seleccionable en su xib o programáticamente

 self.yourTextView.selectable = YES; 

y luego tiene que deshabilitar las pergaminos y habilitar de nuevo después de configurar su texto.

 self.yourTextView.scrollEnabled = NO; [self.yourTextView setText:contentString]; self.yourTextView.scrollEnabled = YES; 

Entonces, usar un UITextView manteniéndolo habilitado, seleccionable, no desplazable y enlaces detectables no es tan simple como parece. Me encontré con esto en iOS 8. Así que mi solución fue hacer algo como esto en viewDidLoad y luego establecer propiedad editable en NO cuando se realiza la edición de cuadro de texto (por lo general sería un método como doneIsTapped). El truco aquí es establecer la propiedad editable en NO después de que se haya completado el ajuste del valor de texto a textview. Esto habilitará los enlaces en la UITextview.

 - (void)viewDidLoad { [super viewDidLoad]; self.txtViewComment.editable = YES; self.txtViewComment.selectable = YES; self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink; self.txtViewComment.scrollEnabled = NO; } 

y

 - (IBAction)doneIsTapped:(id)sender { self.txtViewComment.text = @"set text what ever you want"; self.txtViewComment.editable = NO; } 

esto hizo que los enlaces estuvieran habilitados en textview. También recomendaría no usar storyboard en este momento (o hasta que Apple resuelva este problema) y simplemente usar el código para evitar confusiones innecesarias. Espero que esto ayude.

La desactivación de la capacidad de desplazamiento de UITextViews me sirvió de algo similar.

Cambiar el color del tinte a otro color realmente funciona. Sin embargo, si se selecciona habilitar, el tono también será del mismo color.

Convierta la propiedad de desplazamiento de UITextView en No. funcionará … Self.textView.ScrollingEnable = NO;

Esta solución alternativa funciona para mí:

 textView.selectable = YES; textView.delegate = self; - (void) textViewDidChangeSelection:(UITextView *)textView; { NSRange range = NSMakeRange(NSNotFound, 0.0); if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) { textView.selectedRange = range; } } 

Si está agregando UITextview mediante progtwigción, solo agregue líneas a continuación:

  _textView.userInteractionEnabled = YES; _textView.dataDetectorTypes = UIDataDetectorTypeLink; _textView.scrollEnabled = NO; _textView.editable = NO; 

Esto funcionó para mí.

Ninguno de los anteriores funcionó para mí, sino que hice esto:

 [self.textView setDataDetectorTypes:UIDataDetectorTypeNone]; [self.textView.setTextColor:[UIColor whiteColor]]; [self.textView setDataDetectorTypes:UIDataDetectorTypeNone]; 

Hice esto con mi vista de texto que se suponía que detectaría todos los tipos, y que tenía un color no detectado configurado en blanco. Puede cambiar el código para representar el color adecuado y los tipos de enlace para detectar.

Si bien este hilo es viejo, no vi una respuesta que me funcionara con Swift, así que aquí va para Swift 2.2

 textView.dataDetectorTypes = UIDataDetectorTypes.Link textView.selectable = true