Атрибутивная строка SwiftUI из HTML вылетает из приложения - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь преобразовать HTML форматированный текст в строку с атрибутом и вставить ее в SwiftUI представление.

Во-первых, у меня есть расширение String, которое преобразует строку HTML на NSAttributedString:

extension String {
    func convertHtml() -> NSAttributedString {
        guard let data = data(using: .utf8) else { return NSAttributedString() }

        if let attributedString = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
            return attributedString
        } else {
            return NSAttributedString()
        }
    }
}

Затем я создал HTMLLabel представление:

struct HTMLLabel: UIViewRepresentable {

    let html: String

    func makeUIView(context: UIViewRepresentableContext<Self>) -> UILabel {
        let label = UILabel()
        label.attributedText = html.convertHtml()

        return label
    }

    func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<Self>) {}

}

Затем я вставляю тест в мое представление SwiftUI:

HTMLLabel(html: "<html><body><b>Hello</b> <i>World</i></body></html>")

Код каждый раз вылетает на if let attributedString = try? ... с EXC_BAD_INSTRUCTION. Я сделал тест в пустом проекте раскадровки, как это:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel(frame: CGRect(x: 50, y: 50, width: 320, height: 50))
        label.attributedText = "<html><body><b>Hello</b> <i>World</i></body></html>".convertHtml()

        view.addSubview(label)
    }
}

Этот код выполняется без проблем. Почему код не работает в SwiftUI контексте?

1 Ответ

2 голосов
/ 14 января 2020

Используйте это: -

struct HTMLLabel: UIViewRepresentable {

let html: String

func makeUIView(context: UIViewRepresentableContext<Self>) -> UILabel {
    let label = UILabel()
    DispatchQueue.main.async {
        if let attributedText = self.html.convertHtml() {
               label.attributedText = attributedText
            }
    }

    return label
}

func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<Self>) {}

}

NSAttributedString.DocumentType. html - это только работа с основным потоком. Вот почему вы получаете cra * sh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...