¿Cómo abrir enlaces web UITextView en un UIWebView en lugar de Safari?

Estoy desarrollando y la aplicación iPhone 3.0. Y estoy tratando de abrir enlaces web en una UITextView en una UIWebView en lugar de Safari. Pero aun así no hay suerte.

UITextView no se puede editar, y detecta perfectamente los enlaces web y los abre en Safari.

¿Cómo evitar eso? ¿Cómo tomar esa url para poder usarla con mi propia UIWebView ?

La forma más simple es anular el webView:decidePolicyForNavigationAction:request:frame:decisionListener: método en UITextView así:

 @interface UITextView (Override) @end @class WebView, WebFrame; @protocol WebPolicyDecisionListener; @implementation UITextView (Override) - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener { NSLog(@"request: %@", request); } @end 

Esto afectará a todos los UITextView s en su aplicación. Si solo requiere esto en una sola vista, cree una subclass y anule el método en ella.

Nota: técnicamente se trata de una API privada y se puede eliminar en cualquier momento. No hay forma de hacerlo a través de la API pública.

editar: a partir de iOS 7.0 se ha introducido un nuevo método en UITextViewDelegate para admitir esto. Vea la respuesta de nihad para más detalles.

Esta es una vieja pregunta, pero en caso de que alguien esté buscando una forma actualizada de hacerlo.

Asigne su viewController que contiene UITextView como delegado en el file .m del viewController y simplemente agregue:

 -(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{ //Do something with the URL NSLog(@"%@", URL); return NO; } 

Con Swift 3, UITextViewDelegate proporciona un UITextViewDelegate textView(_:shouldInteractWith:in:interaction:) . textView(_:shouldInteractWith:in:interaction:) tiene la siguiente statement:

Pregunta al delegado si la vista de text especificada debería permitir el tipo especificado de interacción del usuario con la URL dada en el range de text dado.

 optional func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool 

El siguiente código muestra cómo abrir los enlaces web UITextView en un SFSafariViewController lugar de SFSafariViewController en la aplicación Safari:

 import UIKit import SafariServices class ViewController: UIViewController, UITextViewDelegate { override func viewDidLoad() { super.viewDidLoad() // Set textView let textView = UITextView() textView.text = "http://www.yahoo.fr http://www.google.fr" textView.isUserInteractionEnabled = true textView.isEditable = false textView.isSelectable = true textView.dataDetectorTypes = UIDataDetectorTypes.link // Add view controller as the textView's delegate textView.delegate = self // auto layout view.addSubview(textView) textView.translatesAutoresizingMaskIntoConstraints = false textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true textView.heightAnchor.constraint(equalToConstant: 300).isActive = true textView.widthAnchor.constraint(equalToConstant: 300).isActive = true } func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { // Open links with a SFSafariViewController instance and return false to prevent the system to open Safari app let safariViewController = SFSafariViewController(url: URL) present(safariViewController, animated: true, completion: nil) return false } }