Formato HTML en UITextView

Soy bastante nuevo en iOS Development y en este momento estoy trabajando en una aplicación que recibe algún tipo de datos JSON. Sin embargo, algunos expertos de Backend pensaron que sería mejor para el usuario si copiara la información directamente de Word y la pegara en el sistema de información. Así que estoy sentado aquí, tratando de hacer un enlace cliqueable en una UITableView.

Analizo los datos de la Web y obtengo una cadena con este formato:

Für mehr Informationen klicken sie here. 

Intenté ya un UILabel, pero después de un poco de investigación utilizo ahora el UITextView a menudo sugerido. En el Inspector Atribuido, lo configuré como un Texto Atribuido y habilité la Detección de Enlace. Ahora el texto se muestra en rojo y se puede hacer clic.

El problema ahora para mí es que todavía faltan las tags HTML y el juego de caracteres correcto (alemán) y no tengo ni idea de cómo mostrarlo de la manera correcta.

La cadena mostrada se analiza de esta manera:

  func showHTMLString(unformattedString: String) -> NSAttributedString{ var attrStr = NSAttributedString( data: tmpString.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil) return attrStr! } 

Si llego a la vista de texto con attrStr?.string el Formato se muestra de la manera correcta, pero el enlace también se attrStr?.string .

¿Alguna sugerencia de cómo formatear la cadena mostrada de la manera correcta?

Gracias de antemano AR4G4

El problema es que tiene que cambiar las opciones de encoding de caracteres de NSUnicodeStringEncoding a NSUTF8StringEncoding para cargar su html de la manera adecuada. Creo que debería crear una propiedad calculada de solo lectura de extensión de cadena para convertir su código html en una cadena atribuida:

Xcode 8.3.1 • Swift 3.1

 extension Data { var attributedString: NSAttributedString? { do { return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil) } catch { print(error) } return nil } } extension String { var data: Data { return Data(utf8) } } 

 let htmlStringCode = "Für mehr Informationen klicken sie here" htmlStringCode.data.attributedString?.string ?? "" // "Für mehr Informationen klicken sie here" 

en tu caso

 yourTextView.attributedText = htmlStringCode.data.attributedString 

Verifique los atributos de su UITextView en IB. Para que los enlaces funcionen, debe tener Selectable Selectable.

enter image description here

Yo recomendaría mostrar HTML en un UIWebView . Es más robusto que usar un UITextView . Consulte Mostrar texto html en uitextview para obtener más información.

Usé el código para Swift 4:

 var descriptionStr : String = String() //Dynamic text let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.caseInsensitive]) let range = NSRange(location: 0, length: descriptionStr.count) let htmlLessString: String = regex.stringByReplacingMatches(in: descriptionStr, options: NSRegularExpression.MatchingOptions(), range:range, withTemplate: "") textViewRef.text = htmlLessString 

Una vez creada la cadena atribuida, entonces establecería la propiedad attributedText de UITextView como la NSAttributedString sí misma, no como la propiedad de string de esa cadena atribuida.

Tus versiones están bastante cerca para comenzar. Como Leonardo Savio Dabus declaró, probablemente debería probar NSUTF * StringEncoding. Lo siguiente produce tu salida esperada para mí. Como dijo, es posible que desee agregarlo a una extensión de cadena, si está haciendo esto mucho.

  let theString = "Für mehr Informationen klicken sie here." let theAttributedString = NSAttributedString(data: str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil) theTextView.attributedText = atString 

Otra forma en que solía hacer esto:

 var someHtmlString = "Für mehr Informationen klicken sie here." let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.CaseInsensitive]) let range = NSRange(location: 0, length: someHtmlString.characters.count) let htmlLessString: String = regex.stringByReplacingMatchesInString(someHtmlString, options: NSMatchingOptions(), range:range, withTemplate: "") 

Resultado final -> htmlLessString es

 "Für mehr Informationen klicken sie here." 

Tenía una aplicación que tenía una UITextView donde quería pegar texto con formato html desde el navegador y luego guardarlo como una cadena (que contiene formato html) a la base de datos, y luego otra vez recuperarlo de la base de datos y mostrarlo con el mismo formato que se copió por primera vez del sitio web. Logré esto haciendo estas dos extensiones:

 extension String { func getAttributedStringFromHTMLString() -> NSAttributedString { do { let attributedString = try NSAttributedString(data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil) return attributedString } catch { print(error) return NSAttributedString() } } } extension NSAttributedString { func getHTMLString() -> String { var htmlText = ""; let documentAttributes = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType] do { let htmlData = try self.dataFromRange(NSMakeRange(0, self.length), documentAttributes:documentAttributes) if let htmlString = String(data:htmlData, encoding:NSUTF8StringEncoding) { htmlText = htmlString } return htmlText } catch { print("error creating HTML from Attributed String") return "" } } }