如何覆盖UITextViewDelegate函数

时间:2017-10-12 11:06:07

标签: ios swift uitextview uitextviewdelegate

我想通过打开网页视图来进行所有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
}

2 个答案:

答案 0 :(得分:0)

据我所知,你想做两件事:

  1. 覆盖所有UITextViews中的功能
  2. 处理事件后呈现WebViewController
  3. 要覆盖您的功能,只需创建一个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