Swift имеет класс под названием UITextView
, у которого есть свойство под названием dataDetectorTypes
, которое будет автоматически сканировать текст на предмет указанных типов данных (например, телефонных номеров, местоположений карт и т. Д. c.), Выделять найденные вхождения и предоставлять варианты взаимодействия с пользователем. В настоящее время я перевожу свое приложение на использование SwiftUI и изо всех сил пытаюсь реализовать специфическое c поведение детектора данных. А именно, когда телефонный номер нажимается, он предлагает возможность позвонить, но при принудительном нажатии (или, как я предполагаю, долгом нажатии) он предлагает несколько вариантов со всей системы, от приложений для обмена сообщениями от собственных до сторонних. Следующие два изображения показывают, о чем я говорю:
Вариант вызова при нажатии
System wide options on force touch
Общесистемные параметры Force Touch
Я попытался обернуть UITextView
внутри UIViewRepresentable
, и это работает по большей части, но это некрасиво и делает интеграцию с остальной частью приложения немного более сложной. И в конце концов, как я его использую, на самом деле нет необходимости во всей мощи UITextView
. На самом деле это просто кнопка со ссылкой.
Я не уверен, какой элемент SwiftUI использовать, но высказал следующие соображения:
Text
: хотя я не Я думаю, что это может справиться с взаимодействием с пользователем Link
: это может быть актуально, но это означает, что мне нужно установить минимальное требование iOS 14 Button
: этот параметр кажется наиболее многообещающим. Используя другие ответы SO, у меня есть что-то вроде этого:
Button("Click Me") {
guard let url = URL(string: "telprompt://\(self.phoneString)"),
UIApplication.shared.canOpenURL(url) else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}.foregroundColor(.blue)
Однако это обеспечивает только первое поведение, возможность вызова при нажатии, а не второе поведение. Есть ли способ составить URL-адрес телефона в Swift, чтобы открыть несколько параметров, сгенерированных системой? Или мне следует сделать что-то другое, используя другую функцию Xcode?