2012-01-26 9 views
28

Ho un'istanza di NSData contenente testo attribuito (NSAttributedString) proveniente da un NSTextView. Voglio convertire la stringa attribuita in una stringa semplice (NSString) senza alcuna formattazione per fare alcune analisi del testo (al momento della conversione non ho accesso al NSTextView di origine né alla sua istanza NSTextStorage).Trasforma una stringa NSAattribuita in testo semplice

Quale sarebbe il modo migliore per farlo?

EDIT:

Per curiosità ho esaminato il risultato di:

[[[self textView] textStorage] words] 

che sembrava essere una cosa utile per fare un po 'l'analisi del testo. La matrice risultante contiene istanze di NSSubTextStorage (ad esempio al di sotto della parola "Orientale"):

Orientale { NSFont = "\" LucidaGrande 11.00 pt. P [] (0x7ffcaae08330) fobj = 0x10a8472d0, spc = 3.48 \ ""; NSParagraphStyle = "Allineamento 0, interlinea 0, 0 ParagraphSpacing, ParagraphSpacingBefore 0, 0 HeadIndent, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, linguette (\ 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, Blocchi (null), Liste (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0 "; }

NSSubTextStorage è probabilmente una classe privata in quanto non è stato possibile trovare alcuna documentazione. Mantiene anche tutta la formattazione.

risposta

53

Se ho capito bene hai un NSData, diciamo data, contenente un NSAttributedString codificato. Per invertire il processo:

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

e per ottenere il testo normale senza attributi che poi fare:

NSString *str = [nas string]; 
+7

Oh mio ... devo andare fuori per un po 'di aria fresca. Grazie per la risposta! Non posso credere di non averlo visto io stesso ... [autoscatto] – Roger

+1

Se un allegato di immagine esiste nello schermo attribuito, la proprietà stringa risultante restituirà un? in quel posto di attaccamento. Sto cercando di trovare una soluzione per questo. Per favore, puoi condividere se hai qualche idea? – Avi

+0

@Avi - Quello che probabilmente stai vedendo è 'NSAttachmentCharacter' e in tal caso puoi semplicemente rimuovere qualsiasi occorrenza. È documentato come parte di 'NSTextAttachment'. – CRD

5

Aggiornamento per Swift 2.2/Swift 3:

attributedText.string 
0

Con Swift 4 e macOS 10.0+, NSAttributedString ha una proprietà chiamata string. string ha la seguente dichiarazione:

var string: String { get } 

Il contenuto di carattere del ricevitore come oggetto NSString.

di Apple afferma anche di string:

caratteri allegato non vengono rimossi dal valore di questa proprietà. [...]


Il seguente codice di giochi mostra come utilizzare NSAttributedString s' string proprietà al fine di recuperare il contenuto di una stringa di NSAttributedString esempio:

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