如何覆盖 UITextViewDelegate 函数

Posted

技术标签:

【中文标题】如何覆盖 UITextViewDelegate 函数【英文标题】:How to override UITextViewDelegate function 【发布时间】:2017-10-12 11:06:06 【问题描述】:

我想让我所有的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

【问题讨论】:

请解释更多...无法理解您想要什么.....您的文本视图是否在同一个视图控制器中? 【参考方案1】:

据我了解,您想做两件事:

    覆盖所有 UITextView 中的函数 处理事件后呈现 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)

【讨论】:

【参考方案2】:

您可以通过创建一个符合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

【讨论】:

以上是关于如何覆盖 UITextViewDelegate 函数的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 9 TextViewShouldReturn [关闭]

UITextViewDelegate 方法在 Swift 3 和 Xcode 8.0 中给出“使用未声明的类型 URL”错误

代码覆盖率是个啥概念?

代码覆盖率是个啥概念?

QSqlQueryModel - 覆盖未调用的函数数据

怎么让 uitextview 不换行,左右滑动