Я пытаюсь настроить UITextView с несколькими ссылками в тексте. Моя реализация основана на предложении, описанном здесь. Большинство ссылок работают должным образом, однако нажатие на некоторые из них приводит к сбою приложения со следующей ошибкой EXC_BREAKPOINT (code=1, subcode=0x185646694)
:
Ошибка сбоя
Стек вызовов
Мой код конфигурации UITextView:
private var actionableLinks = [(String, ()->Void)]() // each link = (actionableString, tapAction)
private func setupMessageText() {
guard messageTextView != nil else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.paragraphSpacingBefore = 16
let attributedText = NSMutableAttributedString(string: messageText, attributes: [
.font: messageTextView.font!,
.foregroundColor: messageTextView.textColor!,
.paragraphStyle: paragraphStyle
])
addActionableLinks(to: attributedText)
messageTextView?.attributedText = attributedText
}
private func addActionableLinks(to attributedText: NSMutableAttributedString) {
actionableLinks.forEach {
let actionableString = $0.0
if let nsRange = messageText.nsRange(of: actionableString) {
attributedText.addAttribute(.link, value: actionableString, range: nsRange)
}
}
}
Чтобы обработать действие касания, я реализовал правильный метод UITextViewDelegate:
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
let tappedLinkString = URL.absoluteString
if let link = actionableLinks.first(where: { $0.0 == tappedLinkString }) {
let tapAction = link.1
tapAction()
return false
}
return true
}
Моя конфигурация раскадровки для этого экрана (я настроил делегата UITextView в раскадровке):
Конфигурация раскадровки
Любые идеи будут высоко оценены! Спасибо.
if let nsRange = messageText.nsRange(of: actionableString), URL(string: actionableString) != nil {
может быть решением. Если вы можете воспроизвести, не могли бы вы указатьactionableString
, который вызывает проблему? - person Larme   schedule 09.06.2021"new terms and conditions"
, преобразованная вURL
, сURL(string: thatString)
внутри Apple, непосредственно перед вызовомtextView(_:shouldInteractWith:in:)
, она равна нулю и приводит к сбою, потому что пробелы недействительны. Процент избегает их (см. второй связанный вопрос) и, возможно, добавляет к ним схему:yourApp://
в качестве префикса. - person Larme   schedule 09.06.2021