最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ios让textview支持特殊标签点击响应(@标签、#标签)
时间:2016-04-06 编辑:简简单单 来源:一聚教程网
比如:输入“@+微博用户昵称(即ID)+空格或标点”,那么在这条微博中这个@条目就会表现成超链接形式,点击即可跳转到被@的某人的微博。
又比如话题标签“#+关键字+#”。表现形式就是点击后会跳转到包含该关键字的微博的搜索结果页面的超链接。
通常情况下,这些带特殊标签符号内容对于多行文本框(UITextView)来说都是视为普通文本,要想让其支持点击,我们可以借助textview的URL检测功能来实现。
(2)通过textview的 UITextFieldDelegate 代理的 shouldInteractWithURL 方法,我们可以捕获到这些自定义的 URL scheme 点击,然后通过判断 URL.scheme 来执行不同的操作。
(1)我们在页面上放置两个 textview,下面一个用来编辑文本。
(1)对于用来显示的textview,要将其 Detection Links(链接检测)打勾,去掉 Editable(使其不可编辑)。
2)扩展UITextView:UITextFieldExtension.swift
import UIKit
extension UITextView {
/**
转换特殊符号标签字段
*/
func resolveHashTags(){
let nsText:NSString = self.text
// 使用默认设置的字体样式
let attrs = [NSFontAttributeName : self.font!]
let attrString = NSMutableAttributedString(string: nsText as String,
attributes:attrs)
//用来记录遍历字符串的索引位置
var bookmark = 0
//用于拆分的特殊符号
let charactersSet = NSCharacterSet(charactersInString: "@#")
//先将字符串按空格和分隔符拆分
let sentences:[NSString] = self.text.componentsSeparatedByCharactersInSet(
NSCharacterSet.whitespaceAndNewlineCharacterSet())
for sentence in sentences {
//如果是url链接则跳过
if !verifyUrl(sentence as String) {
//再按特殊符号拆分
let words:[NSString] = sentence.componentsSeparatedByCharactersInSet(
charactersSet)
var bookmark2 = bookmark
for i in 0..
let keyword = chopOffNonAlphaNumericCharacters(word as String)
if keyword != "" && i>0{
//使用自定义的scheme来表示各种特殊链接,比如:mention:hangge
//使得这些字段会变蓝色且可点击
//匹配的范围
let remainingRangeLength = min((nsText.length - bookmark2 + 1),
word.length+2)
let remainingRange = NSRange(location: bookmark2-1,
length: remainingRangeLength)
print(keyword, bookmark2, remainingRangeLength)
//匹配@某人
var matchRange = nsText.rangeOfString("@\(keyword)",
options: .LiteralSearch,
range:remainingRange)
attrString.addAttribute(NSLinkAttributeName,
value: "mention:\(keyword)",
range: matchRange)
//匹配#话题#
matchRange = nsText.rangeOfString("#\(keyword)#",
options: .LiteralSearch,
range:remainingRange)
attrString.addAttribute(NSLinkAttributeName,
value: "hash:\(keyword)",
range: matchRange)
}
//移动坐标索引记录
bookmark2 += word.length + 1
}
}
//移动坐标索引记录
bookmark += sentence.length + 1
}
print(nsText.length,bookmark)
//最终赋值
self.attributedText = attrString
}
/**
验证URL格式是否正确
*/
private func verifyUrl(str:String) -> Bool {
// 创建一个正则表达式对象
do {
let dataDetector = try NSDataDetector(types:
NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))
// 匹配字符串,返回结果集
let res = dataDetector.matchesInString(str,
options: NSMatchingOptions(rawValue: 0),
range: NSMakeRange(0, str.characters.count))
// 判断结果(完全匹配)
if res.count == 1 && res[0].range.location == 0
&& res[0].range.length == str.characters.count {
return true
}
}
catch {
print(error)
}
return false
}
/**
过滤部多余的非数字和字符的部分
比如:@hangge.123 -> @hangge
*/
func chopOffNonAlphaNumericCharacters(text:String) -> String {
let nonAlphaNumericCharacters = NSCharacterSet
.alphanumericCharacterSet().invertedSet
let characterArray = text
.componentsSeparatedByCharactersInSet(nonAlphaNumericCharacters)
return characterArray[0]
}
}
(3)测试页面代码:
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
//展示文本框
@IBOutlet weak var displayTextView: UITextView!
//编辑文本框
@IBOutlet weak var editTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
//设置展示文本框的代理
displayTextView.delegate = self
}
//发送消息
@IBAction func setMessage(sender: AnyObject) {
//设置展示文本框的内容
displayTextView.text = editTextView.text
//对内容中的特殊标签字段做处理
displayTextView.resolveHashTags()
//清空输入框内容
editTextView.text = ""
}
//展示文本框链接点击响应
func textView(textView: UITextView, shouldInteractWithURL URL: NSURL,
inRange characterRange: NSRange) -> Bool {
//判断URL scheme
switch URL.scheme {
case "hash" :
showAlert("hash", payload:
URL.resourceSpecifier.stringByRemovingPercentEncoding!)
case "mention" :
showAlert("mention", 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)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
原文出自:www.hangge.com
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22