2012-01-26 18 views
28

Tengo una instancia de NSData que contiene un texto atribuido (NSAttributedString) que se origina en NSTextView. Quiero convertir la cadena atribuida a una cadena simple (NSString) sin ningún formato para hacer un análisis de texto (en el momento de la conversión no tengo acceso al NSTextView de origen ni a su instancia NSTextStorage).Transformar un NSAttributedString en texto sin formato

¿Cuál sería la mejor manera de hacerlo?

EDIT:

Por curiosidad me examinó el resultado de:

[[[self textView] textStorage] words] 

que parecía ser una cosa útil para hacer un poco de análisis de textos. La matriz resultante contiene casos de NSSubTextStorage (ejemplo a continuación de la palabra "este"):

oriente { NSFont = "\" LucidaGrande 11,00 pt. P [] (0x7ffcaae08330) fobj = 0x10a8472d0, spc = 3.48 \ ""; NSParagraphStyle = "Alineación 0, interlineado 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\ n 28L, \ n 56L, \ n 84L, \ n 112L, \ n
140L, \ n 168L, \ n 196L, \ n 224L, \ n 252L, \ n 280L, \ n
308L, \ n 336L \ n), DefaultTabInterval 0, Bloques (null), listas (nulo), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0 "; }

NSSubTextStorage es probablemente una clase privada ya que no pude encontrar ninguna documentación para ello. También conserva todo el formato.

Respuesta

53

Si le entiendo correctamente, tiene un NSData, digamos data, que contiene un NSAttributedString codificado. Para invertir el proceso:

NSAttributedString *nas = [[NSAttributedString alloc] initWithData:data 
                  options:nil 
               documentAttributes:NULL 
                  error:NULL]; 

y para obtener el texto sin atributos, a continuación, hacer:

NSString *str = [nas string]; 
+7

Oh mi ... tengo que salir para tomar un poco de aire fresco ¡Gracias por la respuesta! No puedo creer que no lo haya visto yo mismo ... [patada automática] – Roger

+1

Si existe un archivo adjunto de imagen en la pantalla atribuida, la propiedad de cadena resultante devolverá un? en el lugar de ese apego. Estoy tratando de encontrar una solución para eso. ¿Puedes compartir si tienes alguna idea? – Avi

+0

@Avi - Lo que probablemente vea es el 'NSAttachmentCharacter' y, de ser así, simplemente puede eliminar las apariciones. Está documentado como parte de 'NSTextAttachment'. – CRD

5

Actualización de Swift 2.2/Swift 3:

attributedText.string 
0

Con Swift 4 y macOS 10.0+, NSAttributedString tiene una propiedad llamada string. string tiene la siguiente declaración:

var string: String { get } 

Los contenidos de carácter del receptor como un objeto NSString.

Apple también afirma acerca string:

caracteres adjuntos no se quitan del valor de esta propiedad. [...]


El siguiente código de juegos muestra cómo utilizar NSAttributedString 's string propiedad con el fin de recuperar el contenido de la cadena de una instancia NSAttributedString:

import Cocoa 

let string = "Some text" 
let attributes = [NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue] 
let attributedString = NSAttributedString(string: string, attributes: attributes) 

/* later */ 

let newString = attributedString.string 
print(newString) // prints: "Some text" 
print(type(of: newString)) // prints: String 
Cuestiones relacionadas