Posted at

UITextViewにHTMLを表示する(Swift3版)

More than 1 year has passed since last update.

Swift3で動作するUITextViewにHTMLを表示するコードがなかったので書いておきます。


NSHTMLTextDocumentTypeが使用不可

Optionとして渡すNSCharacterEncodingDocumentAttributeの値にNSHTMLTextDocumentTypeを使用しようとするとString.Encoding.utf8を使えとXcodeさんに怒られます。


String.Encoding.utf8を使うとアプリが落ちる

しかし、String.Encoding.utf8を設定するとNSAttributedStringの実行時にエラーが発生してアプリが落ちてしまいます。。。


対応

こちらで同様の問題でハマっている方を発見。

AppleのリファレンスによればNSCharacterEncodingDocumentAttributeの値に設定できるのはNSNumber型とのこと。

String.Encoding.utf8はString.Encoding型なのでもちろんNGですね。

String.Encoding.utf8.rawValueとするのがキモ。

以下にHTML形式の文字列をNSAttributedStringにして返すメソッドを載せておきます。

    /// HTML形式で記述された文字列をNSAttributedStringに変換する

///
/// - Parameter text: 変換する文字列
/// - Returns: HTMLドキュメントに変換されたNSAttributedString
func parseText2HTML(sourceText text: String) -> NSAttributedString? {

// 受け取ったデータをUTF-8エンコードする
let encodeData = text.data(using: String.Encoding.utf8, allowLossyConversion: true)

// 表示データのオプションを設定する
let attributedOptions : [String: AnyObject] = [
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject,
NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue as AnyObject
]

// 文字列の変換処理
var attributedString:NSAttributedString?
do {
attributedString = try NSAttributedString(
data: encodeData!,
options: attributedOptions,
documentAttributes: nil
)
} catch let e {
// 変換でエラーが出た場合
}

return attributedString
}