Actualización: desde ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
De ios 7y más tarde UITextView
tiene el método delegado:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
para interceptar los clics a los enlaces. Y esta es la mejor forma de hacerlo.
por ios 6y anteriormente, una buena manera de hacer esto es subclasificando UIApplication
y sobrescribiendo el-(BOOL)openURL:(NSURL *)url
@interface MyApplication : UIApplication {
}
@end
@implementation MyApplication
-(BOOL)openURL:(NSURL *)url{
if ([self.delegate openURL:url])
return YES;
else
return [super openURL:url];
}
@end
Deberá implementar openURL:
en su delegado.
Ahora, para que la aplicación comience con su nueva subclase de UIApplication
, ubique el archivo main.m en su proyecto. En este pequeño archivo que inicia su aplicación, generalmente hay esta línea:
int retVal = UIApplicationMain(argc, argv, nil, nil);
El tercer parámetro es el nombre de la clase de su aplicación. Entonces, reemplazando esta línea por:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
Esto funcionó para mí.
UIApplication
y reemplazar la implementación de openURL. Aunque de esta manera es complicado (pero no imposible) hacer referencia a la implementación original.En iOS 7 o posterior
Puede utilizar el siguiente método de delegado de UITextView:
La vista de texto llama a este método si el usuario toca o mantiene presionado el enlace URL. La implementación de este método es opcional. Por defecto, la vista de texto abre la aplicación responsable de manejar el tipo de URL y le pasa la URL. Puede utilizar este método para activar una acción alternativa, como mostrar el contenido web en la URL en una vista web dentro de la aplicación actual.
Importante:
fuente
UIWebView
si desea hacer otro texto en el enlace y no en la URL en sí. La<a>
etiqueta sigue siendo la mejor forma de hacerlo en ese caso.Para Swift 3
o si el objetivo es> = IOS 10
fuente
Con Swift 5 y iOS 12, puede utilizar uno de los tres patrones siguientes para interactuar con enlaces en un
UITextView
.# 1. Usando
UITextView
'sdataDetectorTypes
propiedad de.La forma más sencilla de interactuar con números de teléfono, urls o direcciones en un
UITextView
es usardataDetectorTypes
property. El código de muestra a continuación muestra cómo implementarlo. Con este código, cuando el usuario toca el número de teléfono,UIAlertController
aparece un mensaje.# 2. Usando
UITextViewDelegate
'stextView(_:shouldInteractWith:in:interaction:)
método deSi desea realizar alguna acción personalizada en lugar de hacer una
UIAlertController
ventana emergente cuando toca un número de teléfono mientras lo usadataDetectorTypes
, debeUIViewController
cumplir con elUITextViewDelegate
protocolo e implementarlotextView(_:shouldInteractWith:in:interaction:)
. El siguiente código muestra cómo implementarlo:# 3. Utilizando
NSAttributedString
yNSAttributedString.Key.link
Como alternativa, puede usar
NSAttributedString
y establecer unURL
para suNSAttributedString.Key.link
atributo. El código de muestra siguiente muestra una posible implementación del mismo. Con este código, cuando el usuario toca la cadena atribuida,UIAlertController
aparece un mensaje.fuente
Versión rápida:
Su configuración estándar de UITextView debería verse así, no olvide el delegado y dataDetectorTypes.
Después de que termine su clase, agregue esta pieza:
fuente
Rápido 4:
1) Cree la siguiente clase (subclase UITextView):
2) Dondequiera que configure su vista de texto, haga esto:
Si está utilizando un guión gráfico, asegúrese de que su vista de texto se vea así en el inspector de identidad del panel derecho:
¡Voila! Ahora obtiene el toque del enlace inmediatamente en lugar de cuando la URL debería interactuar con el método URL
fuente
No lo he intentado yo mismo, pero puede intentar implementar el
application:handleOpenURL:
método en el delegado de su aplicación; parece que todas lasopenURL
solicitudes pasan por esta devolución de llamada.fuente
No estoy seguro de cómo interceptaría el enlace de datos detectado o qué tipo de función necesita ejecutar. Pero es posible que pueda utilizar el método didBeginEditing TextField para ejecutar una prueba / escanear a través del campo de texto si sabe lo que está buscando ... como comparar cadenas de texto que cumplen con el formato ### - ### - ####, o comience con "www." para tomar esos campos, pero necesitaría escribir un pequeño código para rastrear la cadena de campos de texto, reconocer lo que necesita y luego extraerlo para el uso de su función. No creo que esto sea tan difícil, una vez que haya reducido exactamente lo que quería y luego haya enfocado sus filtros de declaración if () hacia un patrón de coincidencia muy específico de lo que necesita.
Por supuesto, esto implica que el usuario va a tocar el cuadro de texto para activar didBeginEditing (). Si ese no es el tipo de interacción del usuario que estaba buscando, puede usar un temporizador de activación, que comienza en ViewDidAppear () u otro según la necesidad y se ejecuta a través de la cadena de campos de texto, luego, al final, ejecute la cadena de campo de texto. métodos que usted construyó, simplemente apague el temporizador.
fuente
application:handleOpenURL:
se llama cuando otra aplicación abre su aplicación abriendo una URL con un esquema que su aplicación admite. No se llama cuando su aplicación comienza a abrir una URL.Creo que la única forma de hacer lo que Vladimir quiere es usar UIWebView en lugar de UITextView. Haga que su controlador de vista implemente UIWebViewDelegate, configure el delegado de UIWebView en el controlador de vista y, en el controlador de vista, implemente
webView:shouldStartLoadWithRequest:navigationType:
para abrir[request URL]
en una vista en lugar de salir de su aplicación y abrirla en Mobile Safari.fuente