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
}