我想通过打开网页视图来进行所有UITextViews
处理链接点击,而不是打开Safari。如何为我的应用程序中的所有UITextView覆盖此委托函数:
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool
我想要输入的代码如下:
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
let webViewController = WebViewController()
webViewController.urlToLoad = URL
present(webViewController, animated: true)
return false
}
答案 0 :(得分:0)
据我所知,你想做两件事:
要覆盖您的功能,只需创建一个UITextView
扩展名来实现您的委托,并将每个UITextView
委托设置为自己:
extension UITextView: UITextViewDelegate {
public func textView(_ textView: UITextView,
shouldInteractWith URL: URL,
in characterRange: NSRange) -> Bool {
let webViewController = WebViewController()
webViewController.urlToLoad = URL
parentViewController.present(webViewController, animated: true)
return false
}
}
要执行第二部分,您应该在textfield和parentViewController之间使用委托。
重要的是要强调扩展将允许您在所有UITextView中实现该方法,但默认情况下,您无权访问UITextView中的parentViewController,因此您需要正确实现委派才能够执行parentViewController.present(webViewController, animated: true)
答案 1 :(得分:-1)
您可以通过创建一个符合UITextViewDelegate
的单独类来实现相同的结果:
class MyTextViewDelegate:NSObject, UITextViewDelegate
{
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
{
//code for opening in UIWebView
return true
}
}
并像这样使用它:
let myTextViewDelegate = MyTextViewDelegate()
let textView = UITextView()
textView.delegate = myTextViewDelegate