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

  • 10
    Like
  • 0
    Comment

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
    }