如何覆盖 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”错误