ios swift swift4 nsattributedstringkey

ios - No se puede convertir el valor de tipo NSAttributedString.DocumentAttributeKey a.DocumentReadingOptionKey



swift swift4 (6)

Debe pasar una de las opciones disponibles de DocumentType NSAttributedString:

Documento de lenguaje de marcado de hipertexto (HTML).

static let html: NSAttributedString.DocumentType

Documento de texto sin formato.

static let plain: NSAttributedString.DocumentType

Documento de formato de texto enriquecido.

static let rtf: NSAttributedString.DocumentType

Formato de texto enriquecido con documentos adjuntos.

static let rtfd: NSAttributedString.DocumentType

En este caso, deberá pasar el primero (html) NSAttributedString.DocumentType.html

Así que la extensión updated a Swift 4 debería verse así:

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

Discusión El importador HTML no debe llamarse desde un hilo de fondo (es decir, el diccionario de opciones incluye documentType con un valor de html). Intentará sincronizarse con el subproceso principal, fallar y agotar el tiempo de espera. Llamarlo desde el hilo principal funciona (pero aún puede expirar 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 de HTML general

Encontré esta extensión de cadena en algún lugar de SO que me permite convertir el código html en una cadena atribuida:

func html2AttributedString() -> NSAttributedString { return try! NSAttributedString(data: self.data(using: String.Encoding.unicode, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) }

Funcionó bien en Swift 3, pero con Swift 4, Xcode se queja:

No se puede convertir el valor del tipo ''NSAttributedString.DocumentAttributeKey'' al tipo de clave del diccionario esperado ''NSAttributedString.DocumentReadingOptionKey''

¿Cómo puedo solucionar esto?


Esto funciona para mí:

let attrStr = try! NSAttributedString( data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!, options:[.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)

Si no añades

.characterEncoding: String.Encoding.utf8. valor bruto

La aplicación se bloqueará.


Esto se produjo después de la conversión automática a Swift 4. Se corrigió cambiando de:

NSMutableAttributedString(data: data, options: [NSAttributedString.DocumentAttributeKey.documentType : NSAttributedString.DocumentType.html], documentAttributes: nil)

a:

NSMutableAttributedString(data: data, options: [.documentType : NSAttributedString.DocumentType.html], documentAttributes: nil) {


Para la cadena HTML, NSAttributedString.DocumentType.html es la opción correcta.

Swift 4

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


Utilizo NSAttributedStringKey y tuve un error similar "No se puede convertir el valor del tipo" en Swift 4. En caso de que alguien que use NSAttributedStringKey venga aquí en busca de una respuesta, así es como lo arreglé:

let TextStroke: [NSAttributedStringKey : Any] = [ NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeColor.rawValue) : UIColor.black, NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor.white, NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeWidth.rawValue) : -6.0,]

Y así es como agrego el atributo al texto:

myLabel.attributedText = NSAttributedString(string: myString, attributes: TextStroke)


Swift 4 : no sé por qué, pero todas las respuestas tienen un error de compilación para mí. así que uso esta extensión:

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

cómo utilizar ?

mylable.text = htmlVariable.html2String