Swift - 给UITextView添加自定义链接,以及链接的点击响应

82 篇文章 1 订阅
我们知道多行文本框( UITextView)具有URL检测功能,将其开启后,它会高亮显示内容中的url链接文字,点击后会使用safari打开这个链接。
     原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应      原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应

1,让textView支持自定义链接
除了能够用浏览器打开url链接外,有时我们还想让内容中的链接能实现一些个性化的功能需求。比如:点击“查看详细说明”后,APP会跳转到功能说明页面。而点击“问题反馈”链接时,又会到进行问题反馈操作。
     原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应     原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应     原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应

2,实现原理:
(1)对于这些特殊的链接我们使用自定义的一些  URL scheme 来表示。比如: about:代表详细说明, feedback:代表问题反馈。
(2)通过拼接  NSMutableAttributedString 的方式,将各个带链接属性、不带链接属性的文本拼接起来,赋值给textview。
(3)使用textview的  UITextFieldDelegate 代理的  shouldInteractWithURL 方法,我们可以捕获到这些自定义的URL scheme点击,然后通过判断  URL.scheme 来执行不同的操作。

3,实现步骤
(1)对于用来显示的textview,要将其  Detection Links(链接检测)打勾,去掉  Editable(使其不可编辑)。
原文:Swift - 给UITextView添加自定义链接,以及链接的点击响应

(2)为方便使用,扩展UITextView:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
extension  UITextView  {
     //添加链接文本(链接为空时则表示普通文本)
     func  appendLinkString(string: String , withURLString: String  "" ) {
         //原来的文本内容
         let  attrString: NSMutableAttributedString  NSMutableAttributedString ()
         attrString.appendAttributedString( self .attributedText)
         
         //新增的文本内容(使用默认设置的字体样式)
         let  attrs = [ NSFontAttributeName  self .font!]
         let  appendString =  NSMutableAttributedString (string: string, attributes:attrs)
         //判断是否是链接文字
         if  withURLString !=  ""  {
             let  range: NSRange  NSMakeRange (0, appendString.length)
             appendString.beginEditing()
             appendString.addAttribute( NSLinkAttributeName , value:withURLString, range:range)
             appendString.endEditing()
         }
         //合并新的文本
         attrString.appendAttributedString(appendString)
         
         //设置合并后的文本
         self .attributedText = attrString
     }
}

(3)样例代码 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import  UIKit
 
class  ViewController UIViewController UITextViewDelegate  {
     
     @IBOutlet  weak  var  textView:  UITextView !
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         //设置展示文本框的代理
         textView.delegate =  self
         
         textView.text =  ""
         textView.appendLinkString( "欢迎使用航歌APP!\n" )
         textView.appendLinkString( "(1)" )
         textView.appendLinkString( "查看详细说明" , withURLString:  "about:from123" )
         textView.appendLinkString( "\n(2)" )
         textView.appendLinkString( "问题反馈" , withURLString:  "feedback:from234" )
     }
     
     //链接点击响应方法
     func  textView(textView:  UITextView , shouldInteractWithURL  URL NSURL ,
         inRange characterRange:  NSRange ) ->  Bool  {
         switch  URL .scheme {
         case  "about"  :
             showAlert( "about" ,
                 payload:  URL .resourceSpecifier.stringByRemovingPercentEncoding!)
         case  "feedback"  :
             showAlert( "feedback" ,
                 payload:  URL .resourceSpecifier.stringByRemovingPercentEncoding!)
         default :
             print ( "这个是普通的url" )
         }
         
         return  true
     }
     
     //显示消息
     func  showAlert(tagType: String , payload: String ){
         let  alertController =  UIAlertController (title:  "检测到\(tagType)标签" ,
             message: payload, preferredStyle: . Alert )
         let  cancelAction =  UIAlertAction (title:  "确定" , style: . Cancel , handler:  nil )
         alertController.addAction(cancelAction)
         self .presentViewController(alertController, animated:  true , completion:  nil )
     }
}

原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1104.html
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值