TabViewとUITextViewとAttributedTextを用いてページめくりでHTML文章を表示させています
UIKitのTextViewをSwiftUIで利用できるようにしているのですが、TextViewにHTML表示させるために、AttributedTextを使用しています。すると、文章の順番がページ順に表示されず、4ページ目に1ページ目がもう一度表示され、文章が全て見ることができません。
見ることができない該当のページまでめくると
AttributeGraph: cycle detected through attribute [数字]
という文がコンソールに表示されます
ソースコード
swift
1import SwiftUI 2 3struct Pages: Codable, Hashable { 4 var page: String 5} 6 7class PassageManager: ObservableObject { 8 @Published var passages = [Pages(page: "<h1>Contents1</h1><p>aaaaaaaaaaa</p><p>aaaa<b>aaaa</b>aaaaaaaaaaaaaaaaaaaaaaa</p><p>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</p>"), 9 Pages(page: "<h1>contents2</h1><p>bbbbbbbbbbbbbbbbbbbbbb</p><p>bbbbbbbbbbbbbbbbbbbbbb</p>"), 10 Pages(page: "<h1>contents3</h1><p>ccccc</p><p>cccccccccccc</p><p>cccccccccccc</p>"), 11 Pages(page: "<h1>contents4</h1>ddddddddd<p></p><p>dddddddddddddddddddddd</p>"), 12 Pages(page: "<h1>contents5</h1><p>ccccc</p><p>ccccccccccccccccccccccccc</p>") 13 ] 14} 15 16struct ContentView: View { 17 @ObservedObject var passageManager = PassageManager() 18 19 var body: some View { 20 TabView { 21 ForEach(0..<passageManager.passages.count) {i in 22 TextView(text: $passageManager.passages[i].page) 23 } 24 } 25 .id(passageManager.passages.hashValue) 26 .tabViewStyle(PageTabViewStyle()) 27 .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always)) 28 } 29}
Swift
1struct TextView: UIViewRepresentable{ 2 @Binding var text: String 3 4 func makeUIView(context: Context) -> UITextView { 5 let view = UITextView() 6 7 let encoded = text.data(using: String.Encoding.unicode)! 8 9 let attributedOptions : [NSAttributedString.DocumentReadingOptionKey : Any] = [.documentType : NSAttributedString.DocumentType.html,] 10 11 let attributedText = try! NSAttributedString(data: encoded, options: attributedOptions, documentAttributes: nil) 12 13 view.attributedText = attributedText 14 view.isEditable = false 15 16 return view 17 } 18 19 func updateUIView(_ textView: UITextView, context: Context) { 20 } 21}
実行例
4枚目の写真のように4ページ目にいるはずだが、1ページ目が表示されている。
試したこと
下のソースコードのようにAttributedTextを使用せずにそのままテキストを表示させるとこの状態は発生しません。
Swift
1struct TextView: UIViewRepresentable{ 2 @Binding var text: String 3 4 func makeUIView(context: Context) -> UITextView { 5 let view = UITextView() 6 view.text = text 7 view.isEditable = false 8 9 return view 10 } 11 12 func updateUIView(_ textView: UITextView, context: Context) { 13 } 14}
このようなエラーの対処法をご存知の方は、ぜひご教示くださると幸いです
あなたの回答
tips
プレビュー