62
задан 6 June 2017 в 10:14

8 ответов

Можно добавить это расширение для преобразования HTML-кода в обычную строку:

редактирование/обновление:

Обсуждение средство импорта HTML нельзя назвать от фонового потока (то есть, словарь опций включает documentType со значением HTML). Это попытается синхронизироваться с основным потоком, перестать работать и испытать таймаут. Вызов его от основных работ потока (но может все еще испытать таймаут, если HTML содержит ссылки на внешние ресурсы, которых нужно избежать любой ценой). Механизм импорта HTML предназначен для реализации чего-то как скидка с цены (то есть, стили текста, цвета, и так далее), не для общего импорта HTML.

Xcode 9 • Быстро 4

extension Data {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return  nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

extension String {
    var html2AttributedString: NSAttributedString? {
        return Data(utf8).html2AttributedString
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}
<час>

Xcode 8.3 • Быстро 3.1

extension String {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: Data(utf8), options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}
<час>
cell.detailTextLabel?.text = item.itemDescription.html2String
212
ответ дан 31 October 2019 в 13:08

Swift 4, Xcode 9

extension String {

    var utfData: Data {
        return Data(utf8)
    }

    var attributedHtmlString: NSAttributedString? {

        do {
            return try NSAttributedString(data: utfData,
            options: [
                      .documentType: NSAttributedString.DocumentType.html,
                      .characterEncoding: String.Encoding.utf8.rawValue
                     ], documentAttributes: nil)
        } catch {
            print("Error:", error)
            return nil
        }
    }
}

extension UILabel {
   func setAttributedHtmlText(_ html: String) {
      if let attributedText = html.attributedHtmlString {
         self.attributedText = attributedText
      } 
   }
}
4
ответ дан 31 October 2019 в 13:08

Вот мой предложенный ответ. Вместо расширения, если Вы хотите вставить функцию.

func decodeString(encodedString:String) -> NSAttributedString?
    {
        let encodedData = encodedString.dataUsingEncoding(NSUTF8StringEncoding)!
        do {
            return try NSAttributedString(data: encodedData, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
            return nil
        }
    }

И вызов, которые функционируют и бросают NSAttributedString для Строкового представления

let attributedString = self.decodeString(encodedString)
let message = attributedString.string
2
ответ дан 31 October 2019 в 13:08

Протестируйте с этим кодом на detailTextLabel:

var attrStr = NSAttributedString(
        data: item.itemDescription.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
cell.detailTextLabel?.text = attrStr
1
ответ дан 31 October 2019 в 13:08

Попытка это решение в swift3

extension String{
    func convertHtml() -> NSAttributedString{
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do{
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }catch{
            return NSAttributedString()
        }
    }
}

Для использования

self.lblValDesc.attributedText = str_postdescription.convertHtml()
1
ответ дан 31 October 2019 в 13:08
let content = givenString // html included string
let attrStr = try! NSAttributedString(data: content.data(using: String.Encoding.unicode, allowLossyConversion: true)!,options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],documentAttributes: nil)
self.labelName.attributedText = attrStr    
0
ответ дан 31 October 2019 в 13:08

я использовал ответ Danboz, только изменили его для возврата простой строки (не строка обогащенного текста):

static func htmlToText(encodedString:String) -> String?
{
    let encodedData = encodedString.dataUsingEncoding(NSUTF8StringEncoding)!
    do
    {
        return try NSAttributedString(data: encodedData, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil).string
    } catch let error as NSError {
        print(error.localizedDescription)
        return nil
    }
}

для меня, это работает как очарование, благодарит Danboz

0
ответ дан 31 October 2019 в 13:08

Расширение Swift4.0

 extension String {
    var html2AttributedString: String? {
    guard let data = data(using: .utf8) else { return nil }
    do {
        return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil).string

    } catch let error as NSError {
        print(error.localizedDescription)
        return  nil
    }
  }
}
0
ответ дан 31 October 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: