2017-10-12 93 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)