如何使用Swift处理“#”和“ @”超链接!
过去,使用“#”和“ @”进行工作对我来说一直是一项具有挑战性的工作,但是我终于找到了一种处理问题的好方法。
设置
首先,这在TextView中效果最好。 因此,可以根据需要在视图内部设置一个,但请确保ViewController具有UITextViewDelegate并将textView委托给该视图控制器。
我也使用一些预填充的信息来执行此操作,但是相同的概念适用于从数据库中提取数据,而并非如此。
[为了教程起见,我使用情节提要板设置了textView。 快速简单。 不要伤害我。]
这是我们设置ViewController的方式:
ViewController类:UIViewController,UITextViewDelegate {
var string =“您好,我叫@Jared&#Jared,我喜欢移动它。”
@IBOutlet弱var textView:UITextView!
覆盖func viewDidLoad(){
super.viewDidLoad()
textView.text =字符串
textView.delegate =自我
}
...
符号解析
现在,我们进入真正的坚韧不拔的东西! (呜!)
我们在这部分中要完成的总体任务只是将textView中的所有单词拆分开。 它比您想象的要简单:
首先,让我们创建扩展:
扩展UITextView {
func resolveTags(){
[向前,这只是将内容添加到resolveTags函数中,直到我另外声明为止]
将我们的字符串转换为NSString。 这允许分离组件。
让nsText:NSString = self.text作为NSString
使用.compenents(separatedBy:“”)<-将该单词分开,在引号中包括该空格。 这将使我们能够分解单个单词。
让单词:[String] = nsText.components(separatedBy:“”)
为您希望文本在TextView中显示的内容设置几个属性。 这些属性将应用于您调用resolveTags的任何TextView,因此请执行以下操作:
令attrs = [
NSAttributedStringKey.font:UIFont.init(名称:“ HelveticaNeue”,大小:13),
NSAttributedStringKey.foregroundColor:UIColor.black
]
创建这些属性后,我们现在需要将这些&nsText馈入NSMutableAttributedString中。 这将使我们能够添加蓝色的亮点并使其可单击。
让attrString = NSMutableAttributedString(string:nsText as String,attribute:attrs)
接下来,我们循环遍历单词并测试前缀。 我们将首先使用“#”
逐字逐句{
如果word.hasPrefix(“#”){
然后,我们需要获取要添加可点击性的字符范围:
让matchRange:NSRange = nsText.range(of:word as String)
然后,我们将单词转换为String而不是NSString。 这将使我们从值的开头删除“#”。 因此,您单击后实际上不会得到@jared,而是实际上只得到了“ jared”。
var stringifiedWord:String =单词为String
stringifiedWord =字符串(stringifiedWord.dropFirst())
接下来,我们向attrString添加几个属性。 在这里,我们只是添加一个链接和该链接的范围。 确保您的值设置为“ hash:\(stringifiedWord)”。 将“哈希”放在前面可让我们稍后将其单击时使其混乱。
attrString.addAttribute(NSAttributedStringKey.link,值:“ hash:\(stringifiedWord)”,范围:matchRange)
最后,我们给它以甜美的蓝色。 👌
attrString.addAttribute(NSAttributedStringKey.foregroundColor,值:UIColor.blue,范围:matchRange)
现在,我们只对“ @”符号做同样的事情。
}否则,如果word.hasPrefix(“ @”){
让matchRange:NSRange = nsText.range(of:word as String)
var stringifiedWord:String =单词为String
stringifiedWord =字符串(stringifiedWord.dropFirst())
attrString.addAttribute(NSAttributedStringKey.link,值:“ user:\(stringifiedWord)”,范围:matchRange)
attrString.addAttribute(NSAttributedStringKey.foregroundColor,值:UIColor.blue,范围:matchRange)
}
最后,非常关键的一步,我们将attrString应用于textView。 💪
self.attributedText = attrString
} //关闭您的resolveTags函数。
让我们用这个东西!
一切都归结于此。 我们有这个功能,现在该如何使用呢?
简单。
在viewDidLoad函数内部,或在任何地方设置textView文本的地方,只需调用:
textView.resolveTags()
现在,这给您带来了结果……但是您还不能单击那些东西。 为什么?!
别担心
我们要做的就是添加以下功能:
func textView(_ textView:UITextView,shouldInteractWith touchedURL:URL,以characterRange:NSRange,交互方式:UITextItemInteraction)-> Bool {
如果您像我之前告诉您的那样将textView的委托设置为ViewController(您完全遵循了……是吗?),则在按下这些突出显示的单词之一时将调用此函数。 现在,让我们在这里添加一些逻辑来处理这些印刷:
如果touchedURL.absoluteString.contains(“ hash:”){
print(“ HASHTAG”)//在这里您可以移动到另一个视图或进行一些令人耳目一新的操作。
}
否则,如果touchedURL.absoluteString.contains(“ user:”){
print(“ USER”)//在这里您可以移动到另一个视图或进行一些令人耳目一新的操作。
}
返回真
如果您在单击文本时遇到麻烦,请尝试将isSelectable打开和将isEditable关闭。
而已!
现在您可以开派对,就像我的朋友没有明天一样,因为现在一切正常。 如果这样做有帮助,并且您感到宽容,请支持我的努力! :]