nshtmltextdocumenttype nsdocumenttypedocumentattribute html ios swift uitextview nsattributedstring

nsdocumenttypedocumentattribute - Swift: muestra datos HTML en una etiqueta o textView



nsdocumenttypedocumentattribute swift 4 (11)

Tengo algunos datos HTML, que contienen encabezados, párrafos, imágenes y etiquetas de listas.

¿Hay alguna manera de mostrar estos datos en un UITextView o UILabel ?


Agregue esta extensión para convertir su código html en una cadena normal:

extension String { var html2AttributedString: NSAttributedString? { guard let data = dataUsingEncoding(NSUTF8StringEncoding) else { return nil } do { return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil) } catch let error as NSError { print(error.localizedDescription) return nil } } var html2String: String { return html2AttributedString?.string ?? "" } }

Y luego muestra su cadena dentro de un UITextView o UILabel

textView.text = yourString.html2String o

label.text = yourString.html2String


Aquí hay una versión de Swift 3:

private func getHtmlLabel(text: String) -> UILabel { let label = UILabel() label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping label.attributedString = stringFromHtml(string: text) return label } private func stringFromHtml(string: String) -> NSAttributedString? { do { let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) if let d = data { let str = try NSAttributedString(data: d, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) return str } } catch { } return nil }

Encontré problemas con algunas de las otras respuestas aquí y me tomó un poco hacerlo bien. Configuré el modo de salto de línea y el número de líneas para que la etiqueta tuviera el tamaño apropiado cuando el HTML abarcó varias líneas.


Estoy usando esto:

extension UILabel { func setHTML(html: String) { do { let attributedString: NSAttributedString = try NSAttributedString(data: html.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil) self.attributedText = attributedString } catch { self.text = html } } }


Gracias por la respuesta anterior aquí es Swift 4.2

extension String { var htmlToAttributedString: NSAttributedString? { guard let data = self.data(using: .utf8) else { return nil } do { return try NSAttributedString(data: data, options: [ NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue ], documentAttributes: nil) } catch let error as NSError { print(error.localizedDescription) return nil } } var htmlToString: String { return htmlToAttributedString?.string ?? "" } }


Mostrar imágenes y párrafos de texto no es posible en un UITextView o UILabel , para esto, debe usar un UIWebView .

Simplemente agregue el elemento en el guión gráfico, enlace a su código y llámelo para cargar la URL.

OBJ-C

NSString *fullURL = @"http://conecode.com"; NSURL *url = [NSURL URLWithString:fullURL]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; [_viewWeb loadRequest:requestObj];

Rápido

let url = NSURL (string: "http://www.sourcefreeze.com"); let requestObj = NSURLRequest(URL: url!); viewWeb.loadRequest(requestObj);

Tutorial paso a paso. http://sourcefreeze.com/uiwebview-example-using-swift-in-ios/


Para Swift 4:

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

Luego, cuando quiera poner texto HTML en un uso de UITextView:

textView.attributedText = htmlText.htmlToAttributedString


Prueba esto:

let label : UILable! = String.stringFromHTML("html String") func stringFromHTML( string: String?) -> String { do{ let str = try NSAttributedString(data:string!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true )!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil) return str.string } catch { print("html error/n",error) } return "" }

Espero que sea útil.


Si desea HTML, con imágenes y una lista, esto no es compatible con UILabel. Sin embargo, he encontrado que YYText hace el truco.


Swift 3

extension String { var html2AttributedString: NSAttributedString? { guard let data = data(using: String.Encoding.utf8) else { return nil } do { return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:String.Encoding.utf8], documentAttributes: nil) } catch let error as NSError { print(error.localizedDescription) return nil } } var html2String: String { return html2AttributedString?.string ?? "" } }


Swift 3.0

var attrStr = try! NSAttributedString( data: "<b><i>text</i></b>".data(using: String.Encoding.unicode, allowLossyConversion: true)!, options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) label.attributedText = attrStr


Tuve problemas para cambiar los atributos del texto después de eso, y pude ver a otros preguntando por qué ...

Entonces, la mejor respuesta es usar la extensión con NSMutableAttributedString en su lugar:

extension String { var htmlToAttributedString: NSMutableAttributedString? { guard let data = data(using: .utf8) else { return nil } do { return try NSMutableAttributedString(data: data, options: [.documentType: NSMutableAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) } catch let error as NSError { print(error.localizedDescription) return nil } } }

Y luego puedes usarlo de esta manera:

if let labelTextFormatted = text.htmlToAttributedString { let textAttributes = [ NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 13) ] as [NSAttributedStringKey: Any] labelTextFormatted.addAttributes(textAttributes, range: NSRange(location: 0, length: labelTextFormatted.length)) self.contentText.attributedText = labelTextFormatted }