如何使用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关闭。

而已!

现在您可以开派对,就像我的朋友没有明天一样,因为现在一切正常。 如果这样做有帮助,并且您感到宽容,请支持我的努力! :]

Interesting Posts