nshtmltextdocumenttype nsdocumenttypedocumentattribute ios swift uitableview

ios - nsdocumenttypedocumentattribute - Convertir HTML a texto sin formato en Swift



nsdocumenttypedocumentattribute swift 4 (8)

Aquí está mi respuesta sugerida. En lugar de extensión, si desea poner dentro de la función.

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 } }

Y llama a esa función y convierte NSAttributedString a String

let attributedString = self.decodeString(encodedString) let message = attributedString.string

Estoy trabajando en una aplicación simple de lector de RSS como proyecto para principiantes en Xcode. Actualmente lo tengo configurado para que analice el feed y coloque el título, la fecha de publicación, la descripción y el contenido y lo muestre en un WebView.

Recientemente decidí mostrar la descripción (o una versión truncada del contenido) en el TableView utilizado para seleccionar una publicación. Sin embargo, al hacerlo:

cell.textLabel?.text = item.title?.uppercaseString cell.detailTextLabel?.text = item.itemDescription //.itemDescription is a String

Muestra el HTML sin formato de la publicación.

Me gustaría saber cómo convertir el HTML en texto sin formato para el UILabel detallado de TableView.

¡Gracias!


Extensión 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 } } }


He usado la respuesta Danboz, solo la cambié para devolver una Cadena simple (no una cadena de texto enriquecido):

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 } }

para mí funciona de maravilla, gracias Danboz


Pruebe con este código para detailTextLabel:

var attrStr = NSAttributedString( data: item.itemDescription.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true), options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil) cell.detailTextLabel?.text = attrStr


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

editar / actualizar:

Discusión El importador HTML no debe ser llamado desde un hilo de fondo (es decir, el diccionario de opciones incluye documentType con un valor de html). Intentará sincronizar con el hilo principal, fallar y tiempo de espera. Llamarlo desde el hilo principal funciona (pero aún puede agotar el tiempo de espera si el HTML contiene referencias a recursos externos, lo que debe evitarse a toda costa). El mecanismo de importación de HTML está destinado a implementar algo como markdown (es decir, estilos de texto, colores, etc.), no para la importación general de HTML.

Xcode 9 • Swift 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 • Swift 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


Prueba esta solución en 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() } } }

Usar

self.lblValDesc.attributedText = str_postdescription.convertHtml()


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 } } }


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