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

咱们知道多行文本框( 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