Настраиваемое действие 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.
Итак, полное решение:
- Добавить атрибут детектора чисел в UITextView
- Реализация UITextViewDelegate func textView(_ textView: UITextView, shouldInteractWith URL: URL, в CharacterRange: NSRange, взаимодействие: UITextItemInteraction) -> Bool
- Добавьте пользовательскую логику, чтобы обрабатывать нажатие соответственно.