如何在UIWebView而不是Safari中打开UITextView网页链接?
我正在开发和iPhone 3.0应用程序。我试图在UITextView中打开一个UIWebView而不是Safari的网页链接。但仍然没有运气。如何在UIWebView而不是Safari中打开UITextView网页链接?
UITextView
不可编辑,它完美检测到网页链接并在Safari中打开它们。
如何避免这种情况?如何抓取该网址,以便我可以使用我自己的UIWebView
?
最简单的方法是重写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执行此操作。
编辑:从iOS 7.0开始,在UITextViewDelegate
上引入了一种新方法来支持这一点。有关详细信息,请参阅nihad的答案。
这是一个古老的问题,但任何人都在寻找更新的方式来做到这一点。
指定您的viewController是持有的UITextView在你的viewController的.m文件的委托,只是补充:
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{
//Do something with the URL
NSLog(@"%@", URL);
return NO;
}
我相信这是iOS 7的正确方式。这对我有帮助,所以谢谢! – ajfigueroa 2014-02-10 07:12:50
@nihad非常感谢,这比以前的解决方案看起来更清洁和简单。 – sunny 2015-06-23 14:54:54
与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
下面的代码演示了如何在SFSafariViewController
打开UITextView
网络链接,而不是在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
}
}
嗯,是私人的,你认为这会是appstore批准的问题? Btw今晚我会检查你的代码,我会让你知道。谢谢。 – crash 2009-08-20 17:49:45
这不是他们可以检查的东西,但是您可能会对未来的操作系统更改造成轻微的风险(这是桌面应用程序中的公共API,Apple不太可能停止使用WebKit,但这是可能的) 。可能发生的最坏情况是行为将返回默认启动MobileSafari。 – rpetrich 2009-08-20 17:59:02
完美。它工作顺利。谢谢! – crash 2009-08-20 22:24:08