使用 Swift 讀取 HTML 到 UITextView

在 Swift 開發中,常常需要在 UITextView 中顯示 HTML 格式的內容。這篇文章將介紹如何使用最新的 Swift 語法將 HTML 內容正確顯示在 UITextView 中,並提供完整的實作範例、錯誤排除方法及延伸應用。

基本的 HTML 內容

我們首先需要準備一段 HTML 內容,這段內容將被顯示在 UITextView 中:

契約編號00261034115<br><a href='https://docs.google.com/gview?202003/00261034115-contract.pdf'>合約連結</a><br>親愛的會員您好。

特殊 HTML href 手動轉換成 UITextView 連結

接下來,我們將編寫一個函數來處理 HTML 中的連結,並將其轉換為可點擊的格式:

func findHtmlHref(textView: UITextView, content: String) -> UITextView {
    if !content.contains("href") {
        let newContent = content.replacingOccurrences(of: "<br>", with: "\n")
        textView.text = newContent
        return textView
    }

    do {
        let doc: Document = try SwiftSoup.parse(content)
        let link: Element = try doc.select("a").first() ?? Element("a")
        let linkHref: String = try link.attr("href")
        let linkText: String = try link.text()

        var newContent = content.replacingOccurrences(of: "<a href='\(linkHref)'>合約連結</a>", with: "@Terms@")
        newContent = newContent.replacingOccurrences(of: "<br>", with: "\n")

        textView.text = newContent
        textView.attributedText = textView.attributedText?.replace(placeholder: "@Terms@", with: linkText, url: linkHref)

        return textView
    } catch {
        print("Error parsing HTML: \(error)")
        return textView
    }
}

如何呼叫函數

以下是如何使用上述函數的範例:

contentTextView = findHtmlHref(textView: yourTextView, content: yourContent)

結果展示

展示結果

將 HTML 直接塞入 UITextView

除了手動處理連結,我們還可以使用以下擴展將 HTML 直接轉換為 NSAttributedString

extension String {
    var htmlToAttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(data: data, options: [.documentType: .html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("Error converting HTML to NSAttributedString: \(error)")
            return nil
        }
    }

    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}

呼叫擴展

使用擴展將 HTML 內容載入到 UITextView 中:

contentTextView.attributedText = yourHtmlString.htmlToAttributedString

結果展示

展示結果

常見問題解答 (Q&A)

Q1: 為什麼我的 HTML 內容沒有正確顯示?

A1: 確保你的 HTML 字串是有效的,並且檢查是否有正確處理所有的 HTML 標籤。如果出現錯誤,檢查控制台的錯誤信息以獲得更多提示。

Q2: 如何在 UITextView 中處理多個連結?

A2: 你可以在 findHtmlHref 函數中使用迴圈遍歷所有的連結,並為每個連結生成可點擊的文本。這樣可以讓 UITextView 同時支持多個連結。

Q3: 有沒有更簡單的方式來顯示 HTML?

A3: 如果你的需求不需要特別的格式化,使用上面的 htmlToAttributedString 擴展可能是最簡單的方式。這樣可以直接將 HTML 轉換為 NSAttributedString,並顯示在 UITextView 中。


Swift 更多文章

Swift 彈出視窗 AlertController 的使用方法 💥
Swift 判斷螢幕方向 📱
Swift Core Data 實現 💾🔥
Swift UISegmentedControl 💻分段控制器!
Swift 實現抽屜效果 🧹

Categorized in: