2017-10-12 127 views
0

我想通过打开web视图来使所有UITextViews处理链接点击,而不是打开Safari浏览器。我怎么能覆盖这个委托功能为我的应用程序内的所有UITextViews:如何覆盖UITextViewDelegate函数

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

请详细解释...不明白你想要什么.....你的textview是否在同一个viewcontroller? –

回答

-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 
0

据我了解有你想要做的两件事情:

  1. 覆盖功能在所有UITextViews
  2. 处理事件

要覆盖后呈现WebViewController您的功能只需创建一个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 
    } 
} 

要做第二部分,你应该在你的文本框和它的parentViewController之间使用委托。

重要的是要强调,该扩展将允许您在所有的UITextView中实现该方法,但默认情况下,您无法访问UITextView中的parentViewController,因此您需要正确实施委派才能执行parentViewController.present(webViewController, animated: true)