web-dev-qa-db-ja.com

UITextViewのHTML形式

私はiOS開発に非常に慣れていないので、現在、ある種のJSONデータを受信するアプリに取り組んでいます。しかし、一部のバックエンドエキスパートは、Wordから直接情報をコピーして情報システムに貼り付けるだけの方がユーザーにとって良いと考えました。だから私はここに座って、UITableViewでクリック可能なリンクを作成しようとしています。

Webからのデータを解析して、次の形式の文字列を取得します。

F&uuml;r mehr Informationen klicken sie <a href="http://www.samplelink.com/subpage.php?id=8">here</a>.

私はすでにUILabelを試してみましたが、いくつかの調査の後、今では頻繁に提案されるUITextViewを使用しています。属性インスペクターで、それを属性テキストとして設定し、リンク検出を有効にしました。これでテキストが赤く表示され、クリック可能になります。

私にとっての問題は、HTMLタグと正しい(ドイツ語)文字セットがまだ欠けていることです。正しい方法で表示する方法がわかりません。

表示された文字列は次のように解析されます:

    func showHTMLString(unformattedString: String) -> NSAttributedString{
    var attrStr = NSAttributedString(
        data: tmpString.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
    return attrStr!
}

TextviewにattrStr?.stringを入力すると、フォーマットは正しい方法で表示されますが、リンクも失われます。

表示された文字列を正しい方法でフォーマットする方法の提案はありますか?

事前に感謝しますAR4G4

11
a2hur

問題は、HTMLを適切にロードするために、文字エンコーディングオプションをNSUnicodeStringEncodingからNSUTF8StringEncodingに変更する必要があることです。文字列拡張の読み取り専用計算プロパティを作成して、htmlコードを属性付き文字列に変換する必要があると思います。

Xcode 8.3.1•Swift 3.1

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print(error)
        }
        return nil
    }
}
extension String {
    var data: Data {
        return Data(utf8)
    }
}

let htmlStringCode = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>"

htmlStringCode.data.attributedString?.string ?? ""  // "Für mehr Informationen klicken sie here"

あなたの場合

yourTextView.attributedText = htmlStringCode.data.attributedString
26
Leo Dabus

IBでUITextViewの属性を確認します。リンクを機能させるには、Selectableをオンにする必要があります。

enter image description here

2
fred02138

HTMLをUIWebViewで表示することをお勧めします。 UITextViewを使用するよりも堅牢です。詳細については、 itextviewでHTMLテキストを表示 を参照してください。

1
tng

Swift 4:のコードを使用しました

var descriptionStr : String = String() //Dynamic text

let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.caseInsensitive])
        let range = NSRange(location: 0, length: descriptionStr.count)
        let htmlLessString: String = regex.stringByReplacingMatches(in: descriptionStr, options: NSRegularExpression.MatchingOptions(), range:range, withTemplate: "")
        textViewRef.text = htmlLessString
1
Mannam Brahmam

ブラウザーからhtml形式のテキストを貼り付け、それを文字列(html形式を含む)としてデータベースに保存し、次にデータベースから取得して表示できるようにするUITextViewを備えたアプリがありました。 Webサイトから最初にコピーされたときと同じ形式です。これを管理するには、次の2つの拡張を行います。

extension String
{
    func getAttributedStringFromHTMLString() -> NSAttributedString
    {
        do {
            let attributedString = try NSAttributedString(data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
            return attributedString
        } catch {
            print(error)
            return NSAttributedString()
        }
    }
}

extension NSAttributedString
{
    func getHTMLString() -> String
    {
        var htmlText = "";
        let documentAttributes = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
        do {
            let htmlData = try self.dataFromRange(NSMakeRange(0, self.length), documentAttributes:documentAttributes)
            if let htmlString = String(data:htmlData, encoding:NSUTF8StringEncoding) {
                htmlText = htmlString
            }
            return htmlText
        }
        catch {
            print("error creating HTML from Attributed String")
            return ""
        }
    }
}
0
Claudia Fitero

あなたのバージョンは最初からかなり近いです。 Leonardo Savio Dabusが述べたように、おそらくNSUTF * StringEncodingを試すべきです。以下は、期待される出力を生成します。彼が言ったように、これを頻繁に行う場合は、それを文字列の拡張子に追加することをお勧めします。

    let theString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
    let theAttributedString = NSAttributedString(data: str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!,
                                                 options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil)
    theTextView.attributedText = atString
0
Jeremy Pope

私がこれを行うために使用した別の方法:

var someHtmlString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.CaseInsensitive])
let range = NSRange(location: 0, length: someHtmlString.characters.count)
let htmlLessString: String = regex.stringByReplacingMatchesInString(someHtmlString, options: NSMatchingOptions(), range:range, withTemplate: "")

最終結果-> htmlLessStringは

"F&uuml;r mehr Informationen klicken sie here."
0
Nebojsa Nadj

属性付き文字列を作成したら、attributedTextUITextViewプロパティを、その属性付き文字列のNSAttributedStringプロパティではなくstring自体に設定します。

0
Rob