UITextView: Исключение - PullRequest
       12

UITextView: Исключение

0 голосов
/ 19 октября 2018

У меня проблема с настройкой текста с атрибутом HTML в UITextView.

В основном я тестирую очень простой HTML-текст, который работает в одном проекте, но не в более новом.HTML-строка выглядит следующим образом:

<table style=\"width:100%\"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr>

Я установил для этой строки значение attributetText следующим образом:

textView.attributedText =
[[NSAttributedString alloc]
 initWithData: [html dataUsingEncoding:NSUTF16StringEncoding]
 options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
 documentAttributes: nil
 error: &err];

В одном проекте это отображается идеально, как и следовало ожидать, тогда как нановый проект Я просто получаю пустое TextView со следующей ошибкой:

    <NSATSTypesetter: 0x2819a9ec0>: Exception *** -[NSConcreteTextStorage attribute:atIndex:effectiveRange:]: Range or index out of bounds raised during typesetting layout manager <NSLayoutManager: 0x2810a1000>
    1 containers, text backing has 38 characters
    Currently holding 38 glyphs.
    Glyph tree contents:  38 characters, 38 glyphs, 3 nodes, 192 node bytes, 128 storage bytes, 320 total bytes, 8.42 bytes per character, 8.42 bytes per glyph
    Layout tree contents:  38 characters, 38 glyphs, 1 laid glyphs, 1 laid line fragments, 3 nodes, 192 node bytes, 1712 storage bytes, 1904 total bytes, 50.11 bytes per character, 50.11 bytes per glyph, 1.00 laid glyphs per laid line fragment, 1904.00 bytes per laid line fragment
, glyph range {0 9}. Ignoring...

Если у кого-то есть идеи, почему это может произойти, это будет очень ценно, так как я сейчас в замешательстве с этим, так как не могуувидеть разницу в настройке между двумя проектами.

Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

Ваш HTML, кажется, в порядке, я могу превратить его в NSAttributedString без проблем, я использую NSUTF8StringEncoding, который отлично работает в большинстве случаев:

NSString *html = @"<table style=\"width:100%\"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr>";

NSData *data = [html dataUsingEncoding:NSUTF8StringEncoding];

textView.attributedText = [[NSAttributedString alloc] initWithData: data
                                                  options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
                                       documentAttributes:nil error:nil];

Также успешно протестирован вигровая площадка Swift.

Вот результат

enter image description here

Игровая площадка Swift внизу:

import UIKit
import PlaygroundSupport

extension NSAttributedString {

    convenience init(html: String) throws {
        let options: [NSAttributedString.DocumentReadingOptionKey : Any] = [
            .documentType: NSAttributedString.DocumentType.html,
            .characterEncoding: String.Encoding.utf8.rawValue
        ]
        let data = html.data(using: .utf8, allowLossyConversion: true)
        try self.init(data: data ?? Data(html.utf8), options: options, documentAttributes: nil)
    }

}

let textView = UITextView(frame: CGRect(x: 0, y: 0, width: 320, height: 500))
textView.attributedText = try? NSAttributedString(html: "<table style=\"width:100%\"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr>")

PlaygroundPage.current.liveView = textView
...