Настраиваемое действие Swift IOS в обнаружении номеров

В нашем приложении у нас есть исходящий 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
}

2 ответа

NSDataDetector дает вам диапазоны чисел. Теперь создайте (непостоянную) атрибутивную строку и для каждого диапазона добавьте ссылку на соответствующий номер URL (NSAttributedString.Key.link: urlString). Затем отобразите текст в UITextView и добавить делегата. В делегате внедрить func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> BoolВ этой функции вы можете решить, какое действие подходит.

Спасибо всем за ваши предложения, это заставило меня подойти к проблеме иначе, чем мой код выше.

Как и @Lutz и @Larme, предложенные выше, переопределив поведение по умолчанию при касании UITextView, я могу собрать число через UITextViewDelegate.

Итак, полное решение:

  1. Добавить атрибут детектора чисел в UITextView
  2. Реализация UITextViewDelegate func textView(_ textView: UITextView, shouldInteractWith URL: URL, в CharacterRange: NSRange, взаимодействие: UITextItemInteraction) -> Bool
  3. Добавьте пользовательскую логику, чтобы обрабатывать нажатие соответственно.
Другие вопросы по тегам