【问题标题】:Swift IOS Custom Action in Number Detection号码检测中的 Swift IOS 自定义操作
【发布时间】:2018-10-25 10:38:13
【问题描述】:

在我们的应用中,我们有一个出站 VOIP 电话拨号器。

我想检测字符串中的数字并添加一个自定义操作,以便代替打开本机拨号器的默认行为,它将转到我们自己在应用程序中的拨号器并预先填充所选号码。

我的第一个想法是将消息正文放入一个字符串数组中,并检查每个单词是否为数字,然后创建一个属性字符串。但是我很难理解如何将属性字符串恢复为字符串,以及我什至会指定什么来打开带有预填充数字的所述屏幕。

我知道 NSDataDetector 可以列出在字符串中找到的数字,但我不知道如何用可点击操作替换这些特定部分并将其作为字符串返回。

如果有人有类似的经历,那么任何帮助将不胜感激?

注意 :此消息的正文显示在 UILabel 控件中。

更新

这是我到目前为止所拥有的......

    func AddNumberLink() -> String {    
    let body = self     
    let wordsInBody = body.components(separatedBy: .whitespaces)

    for i in 0..<wordsInBody.count {            
        var word = wordsInBody[i]           
        if word.isTelephoneNumeric {            
        let attributedString = NSMutableAttributedString(string:word)
    attributedString.addAttribute(NSAttributedStringKey.link, value:"https://www.google.com",range: NSRange(location: 0, length: word.count))



  attributedString.addAttribute(NSAttributedStringKey.foregroundColor,value: UIColor.red, range: NSRange(location:0, length: word.count))
        word = attributedString.string
        }       
    }
return body
}

【问题讨论】:

  • 你能分享你到目前为止所做的代码或用更好的例子解释吗?
  • UITextView + NSDataDetector 可能会触发UITextViewDelegate 方法textView(_:shouldInteractWith:in:interaction:)。如果您希望它是可触摸的,请不要使用UILabel。这不是设计的。有允许它的外部库,但这不是它的最初目的。 2:30 见developer.apple.com/videos/play/wwdc2018/221

标签: ios swift string format nsattributedstring


【解决方案1】:

NSDataDetector 为您提供数字的范围。现在,创建一个(可变)属性字符串,并为每个范围添加一个指向相应数字 URL (NSAttributedString.Key.link: urlString) 的链接。 然后,在UITextView 中显示文本并添加一个委托。 在委托中,实现func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -&gt; Bool 在这个函数中,你可以决定什么动作是合适的。

【讨论】:

  • 谢谢,我会试试这个方法,你建议我如何重新加入它。例如:“给我回电话 0800123001”
  • 如果我建议NSDataDetector 已经触发了 UITextViewDelegate 方法,则无需创建NSAttributedString,除非您想要进行一些自定义,但即使这样也可以使用@987654327 进行更改@UITextView 的属性。
【解决方案2】:

感谢大家的建议,这使我以与上面的代码不同的方式解决问题。

像上面建议的@Lutz 和@Larme 一样,通过在点击 UITextView 时覆盖默认行为,我可以通过 UITextViewDelegate 收集数字。

所以完整的解决方案是:

  1. 为 UITextView 添加数字检测器属性
  2. 实现 UITextViewDelegate func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
  3. 添加自定义逻辑以相应地处理点击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多