Ручное форматирование URL, начинающегося с http или https в строке для UITextView iOS / Xcode - PullRequest
0 голосов
/ 25 июня 2018

Я бы хотел выбрать из строки несколько URL-адресов, начиная только с http или https. В UITextView .dataDetectorTypes можно установить на .link, чтобы все URL-адреса были выделены синим подчеркнутым текстом.

Например, из "www.google.com and https://www.gogole.com and http://www.google.com as well as "google.com" я хотел бы сделать только URL-адрес, начинающийся с https или http, в синий подчеркнутый текст и оставить их в том же исходном предложении, если не в новом предложении с измененными выбранными URL-адресами. Возможен ли такой подход? Или каким образом я мог бы это реализовать .?

1 Ответ

0 голосов
/ 25 июня 2018

Способ сделать это:
Используйте NSMutableAttributedString.
Используйте NSDataDetector, чтобы найти все ссылки.
Перечислите (enumerateMatches(in:options:range:using:)) и отредактируйте согласно вашему правилу, если вы хотите добавить или нет NSAttributedStringKey.link.

let initialString = "www.google.com and https://www.gogole.com and http://www.google.com as well as \"google.com\""
let linkDetector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)

let attributedString = NSMutableAttributedString(string: initialString)

linkDetector.enumerateMatches(in: attributedString.string,
                              options: [],
                              range: NSRange(location: 0, length: attributedString.string.utf16.count)) { (match, flags, stop) in
                                if let match = match, match.resultType == NSTextCheckingResult.CheckingType.link, let url = match.url {
                                    if let range = Range(match.range, in: attributedString.string) {
                                        let substring = attributedString.string[range]
                                        if substring.hasPrefix("http") {
                                            attributedString.addAttribute(.link, value: url, range: match.range)
                                        }
                                    }
                                }
}

Я использовал тест substring.hasPrefix("http"), но вы можете использовать тот, который вам нужен.

Выход:

attributedString:
www.google.com and {
}https://www.gogole.com{
    NSLink = "https://www.gogole.com";
} and {
}http://www.google.com{
    NSLink = "http://www.google.com";
} as well as "google.com"{
}
...