Как открыть веб-ссылки UITextView в UIWebView вместо Safari?
Я разрабатываю приложение iPhone 3.0. И я пытаюсь открыть веб-ссылки в UITextView в UIWebView вместо Safari. Но все равно не повезло.
UITextView
не редактируется, и он отлично обнаруживает веб-ссылки и открывает их в Safari.
Как этого избежать? Как захватить этот URL-адрес, чтобы я мог использовать его со своим UIWebView
?
Ответы
Ответ 1
Самый простой способ - переопределить метод webView:decidePolicyForNavigationAction:request:frame:decisionListener:
на UITextView
так:
@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
Это повлияет на все UITextView
в вашем приложении. Если это требуется только для одного представления, создайте подкласс и переопределите метод.
Примечание. Это технически частный API и может быть удален в любое время. Нет никакого способа сделать это с помощью общедоступного API.
edit: с iOS 7.0 для UITextViewDelegate
был введен новый метод для UITextViewDelegate
. Подробнее см. В сообщении nihad.
Ответ 2
Это старый вопрос, но если кто-то ищет обновленный способ сделать это.
Назначьте свой viewController, который содержит UITextView в качестве делегата в вашем файле viewController.m и просто добавьте:
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{
//Do something with the URL
NSLog(@"%@", URL);
return NO;
}
Ответ 3
С Swift 3, UITextViewDelegate
предоставляет метод textView(_:shouldInteractWith:in:interaction:)
. textView(_:shouldInteractWith:in:interaction:)
имеет следующее объявление:
Запрос делегату, если указанное текстовое представление должно разрешить указанный тип взаимодействия пользователя с данным URL в заданном диапазоне текста.
optional func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
В следующем коде показано, как открыть UITextView
веб-ссылки в SFSafariViewController
, а не открывать их в приложении 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 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
}
}