swift Assert失败:(forceBreakIndex > NSMaxRange(lastResortNode->lineBreak.range)),function -[_NSOptimalLineBreaker _calculateOptimalWrapping]

kse8i1jr  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(106)

我发现了一个bug,它是用NSAttributedString解析HTML字符串,并使用AttributedTextUITextView中使用它。错误是这样的:
Assert失败:(forceBreakIndex > NSMaxRange(lastResortNode->lineBreak.range)),函数-[_NSOptimalLineBreaker _calculateOptimalWrapping],文件NSOptimalLineBreaker.m,第1706行。
解析似乎在iOS 15或更低版本上工作正常。但在iOS 16或更高版本中,它会因上述错误而崩溃。
有什么解决方法吗?或者这只是因为iOS版本的问题?
我已经尝试使用最简单的NSAttributedString解析HTML内容,但它仍然在iOS 16或更高版本中崩溃。
因此,对于HTML内容的解析代码,我使用以下代码:

func setHTMLContent(_ htmlContent: String, font: UIFont, textColor: UIColor) {
    guard let attributedString = try? NSMutableAttributedString(data: htmlContent.data(using: .utf8)!, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) else { return }
        
    attributedString.addAttributes([.font: font, .foregroundColor: textColor], range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
}

要将其用于一些textview,只需简单地调用:

SomeTextView.setHTMLContent("Some HTML content", font: UIFont.systemFont(ofSize: 14), textColor: .white)

对于一些HTML,它在iOS 16以上完美地工作。但是对于另一个HTML,它在上面的iOS 16上崩溃了。但它在iOS 16上运行得很好。我不能提供的HTML内容,使这崩溃,因为它是保密的。为什么我认为问题不在于HTML内容,因为例如在iOS 15上它工作得很好,所以我认为在iOS 16上使用NSAttributedString解析会导致崩溃。

bkhjykvo

bkhjykvo1#

如果HTML字符串在句子中间包含 ,则会发生此问题。在将html转换为属性字符串之前,只需将 替换为空格,然后转换它。我希望这个答案对你有帮助。

相关问题