Swift 5中如何实现点击UITextView富文本超链接push视图控制器
实现方案
步骤1:配置自定义scheme的富文本链接
给GoToHomeScreen文本添加自定义协议前缀的链接,和普通网页链接做区分,避免系统默认触发网页跳转逻辑。示例代码如下:
let attributesString = NSMutableAttributedString(string: "GoToHomeScreen for know more about app and for info aboutUs ") // 动态计算GoToHomeScreen的文本范围,避免手动计算range出错 let homeLinkRange = (attributesString.string as NSString).range(of: "GoToHomeScreen") // 添加自定义scheme的链接,前缀可以自定义为你APP专属的标识 attributesString.addAttribute(.link, value: "myapp://goToHomeScreen", range: homeLinkRange) // 原有aboutUs的网页链接配置保持不变 attributesString.addAttribute(.link, value: "https://apple.com/aboutUs", range: NSRange(location: 50, length: 7)) // 注意你原代码的textFields为笔误,需替换为你实际的UITextView实例 textView.isEditable = false textView.isSelectable = true // 必须开启,否则链接点击事件不会响应 textView.delegate = self textView.attributedText = attributesString
步骤2:实现UITextView代理方法处理链接点击
实现UITextViewDelegate的链接交互代理方法,根据链接类型区分处理逻辑:自定义scheme的链接执行push控制器操作,普通网页链接保留原有打开逻辑。示例代码如下:
// 给当前控制器遵守UITextViewDelegate协议 extension YourViewController: UITextViewDelegate { func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { // 判断是否是跳转首页的自定义链接 if URL.scheme == "myapp", URL.host == "goToHomeScreen" { // 替换为你自己的首页控制器实例,执行push操作 let homeViewController = HomeViewController() navigationController?.pushViewController(homeViewController, animated: true) // 返回false阻止系统默认的链接跳转行为 return false } // 其他链接(比如aboutUs的网页链接)走原有逻辑,返回true即可 return true } }
注意:如果需要兼容iOS10以下版本,可以使用旧版的代理方法
textView(_:shouldInteractWith:in:),逻辑和上述实现一致。
内容的提问来源于stack exchange,提问作者Sanjay Mishra
相关产品推荐
相关产品推荐

