Отображение текста HTML в SwiftUI, вызывающее цикличность атрибутов или сбоиIOS

Программируем под IOS
Ответить
Anonymous
 Отображение текста HTML в SwiftUI, вызывающее цикличность атрибутов или сбои

Сообщение Anonymous »

Мне нужно иметь возможность отображать текст с тегами HTML с помощью текстового представления SwiftUI.
Следуя инструкциям, я пришел к этому решению UIViewRepresentable, используя NSAttributedString.

Код: Выделить всё

struct HTMLText: UIViewRepresentable {
var attributedText: NSAttributedString

init(text: String) {
self.attributedText = text.htmlToAttributedString
}

func makeUIView(context: Context) -> UITextView {
let uiTextView = UITextView()

uiTextView.backgroundColor = .red
uiTextView.textContainerInset = .zero
uiTextView.isEditable = false
uiTextView.isScrollEnabled = false
uiTextView.textContainer.lineFragmentPadding = 0

return uiTextView
}

func updateUIView(_ uiTextView: UITextView, context: Context) {
uiTextView.attributedText = attributedText
}

}

extension String {
var htmlToAttributedString: NSAttributedString {
guard let data = data(using: .utf8) else {
return NSAttributedString(string: self) }
do {
return try NSAttributedString(
data: data,
options: [.documentType: NSAttributedString.DocumentType.html,
.characterEncoding:String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch {
return NSAttributedString(string: self)
}
}
}
Хотя это хорошо работает для простых представлений, я столкнулся с трудностями при включении его в свое приложение. Что-то связанное с NavigationStack вызывает циклы в графе атрибутов: === AttributeGraph: цикл обнаружен через атрибут 96280 ===. В моем приложении регистрируется несколько десятков таких сообщений, а текстовое поле не отображается. Что еще более опасно, GeometryReader, используемый непосредственно в качестве родительского представления, по-видимому, вызывает SIGABRT с регистрацией сбоя предварительного условия: значение установки во время обновления: 768.
Эта репликация вызывает циклы, хотя их всего несколько, и отображается текст:

Код: Выделить всё

struct ContentView: View {
@State var showView: Bool = false

var body: some View {
NavigationStack {
Button(action: {
showView.toggle()
}, label: {
Text("Show view")
})
.navigationDestination(isPresented: $showView, destination: {
ScrollableView()  // Putting the scroll view here directly seems to be fine
})
}
}
}

struct ScrollableView: View {
var body: some View {
ScrollView {
HTMLText(text: "hello  world ")
}
}
}
И это приводит к полному сбою.

Код: Выделить всё

struct Crash: View {
var body: some View {
GeometryReader { _ in
HTMLText(text: "hello  world ")
}
}
}
Точная ситуация, когда что-то идет не так, — это когда строковые данные пытаются закодировать в атрибутируемую строку, даже если они заключены в блок try, ошибка, похоже, не возникает. здесь вообще обращаются. Мне не удалось найти другие способы отображения HTML-текста, есть ли у меня другие варианты? Какие шаги я могу предпринять, чтобы попытаться отладить граф атрибутов?

Подробнее здесь: https://stackoverflow.com/questions/792 ... or-crashes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»