2013-05-03 9 views
6

Ho NSString e ho bisogno di fare NSAttributedString.Converti NSAattributedString in stringa e ritorno

NSString è qualcosa di simile:

bvcx b vcxbcvx bcxvbcxv bvx xbc bcvx bxcv bcxv bcxv bcxv bcvx bcvx bcxvbcvx bvc bcvx bxcv{ 
NSFont = "\"LucidaGrande 24.00 pt. P [] (0x108768a80) fobj=0x108788880, spc=7.59\""; 
NSParagraphStyle = "Alignment 4, LineSpacing 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, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0"; 
} 

E 'NSAttributedString in UTF-8. C'è un modo come farlo?

+0

Stai cercando 'NSAttributedString * attrStr = [[NSAribributoString alloc] initWithString: @" foo "];'? –

+0

No, ho bisogno di nsattributestring formattato. Thx per interesse. –

+0

Quindi è possibile utilizzare 'NSMutableAttributedString' e aggiungere qualsiasi tipo di attributi che si desidera. –

risposta

8

Hai detto che hai creato il tuo stringa di input da un NSAttributedString esistente in questo modo:

[NSString stringWithFormat:@"%@", nsattributedstring] 

Il %@ di formato invia il messaggio description all'oggetto nsattributedstring. Il metodo description non è progettato per produrre una stringa che può essere facilmente convertita in un oggetto NSAttributedString. È progettato per aiutare i programmatori a eseguire il debug del codice.

Il processo di conversione di un oggetto in una stringa o una matrice di byte, in modo che possa essere riconvertito in un oggetto in un secondo momento, viene chiamato serializzazione . L'utilizzo del metodo %@ o description non è generalmente un buon metodo per eseguire la serializzazione. Se vuoi davvero deserializzare la stringa creata con il metodo description, dovrai scrivere il tuo parser. Per quanto ne so, non ci sono API per questo.

Invece, Cocoa fornisce un sistema progettato per serializzare e deserializzare oggetti. Gli oggetti che possono essere serializzati utilizzando questo sistema sono conformi al protocollo NSCoding. NSAttributedString oggetti conformi a NSCoding. Quindi cercate la serializzazione stringa attribuito originale in questo modo:

NSMutableData *data = [NSKeyedArchiver archivedDataWithRootObject:nsattributedstring]; 

Salva data (che è binario non leggibile, non UTF-8), ovunque è necessario. Quando è necessario ricreare la stringa attribuito, fare questo:

NSAttributedString *fancyText = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Se si sta programmando per OS X (non iOS), si dispone di un'alternativa. È possibile trasformare una stringa attribuita in formato RTF (rich text format), che è leggibile da un punto di vista umano, utilizzando lo RTFFromRange:documentAttributes: method (che omette gli allegati) o lo RTFDFromRange:documentAttributes: method (che include gli allegati). Quindi è possibile trasformare i dati RTF in una stringa attribuita utilizzando initWithRTF:documentAttributes: o initWithRTFD:documentAttributes:. Questi metodi non sono disponibili su iOS.

Se si sta programmando per iOS 7.0 o versione successiva, è possibile utilizzare -dataFromRange:documentAttributes:error: o fileWrapperFromRange:documentAttributes:error: per convertire la stringa attribuito a RTF/RTFD. È necessario impostare NSDocumentTypeDocumentAttribute su NSRTFTextDocumentType o NSRTFDTextDocumentType negli attributi del documento. Utilizzare initWithData:options:documentAttributes:error: o initWithFileURL:options:documentAttributes:error: per riconvertire in un NSAttributedString. Questi metodi fanno parte di NSAttributedString UIKit Additions.

+0

Grazie per la risposta. Conosco NSCoding, ma ho bisogno di ottenere UTF-8 di NSAttributedString perché sto scrivendo una stringa in un file xml UTF-8. C'è un modo come farlo? –

+1

@ MichalJuriJurník: non esiste "UTF-8 di NSAttributedString". Un NSAttributedString è una stringa più attributi; puoi codificare qualsiasi stringa come dati UTF-8, ma devi comunque serializzare gli attributi separatamente, quindi deserializzare/decodificarli entrambi e rimetterli insieme sull'altra estremità. Usa i metodi RTF; sono progettati per questo. –

+0

Thx per una buona idea;) –