2013-05-03 13 views
6

Mam NSString i potrzebuję zrobić NSAttributedString.Konwertuj NSAttributedString na ciąg i cofnij

NSString jest czymś w rodzaju:

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"; 
} 

To NSAttributedString w UTF-8. Czy jest jakiś sposób, aby to zrobić?

+0

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

+0

Nie, potrzebuję sformatowanego nsattributestring. Thx za zainteresowanie. –

+0

Następnie możesz użyć 'NSMutableAttributedString' i dodać dowolny rodzaj atrybutów, które chcesz. –

Odpowiedz

8

Mówiłeś, że stworzył swój ciąg wejściowy z istniejącego NSAttributedString tak:

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

%@ Format specifier wysyła wiadomość description do obiektu nsattributedstring. Metoda description nie jest zaprojektowana do tworzenia łańcucha, który można łatwo przekonwertować z powrotem na obiekt NSAttributedString. Został zaprojektowany, aby pomóc programistom w debugowaniu kodu.

Proces przekształcania obiektu na ciąg lub tablicę bajtów, dzięki czemu można go później przekonwertować na obiekt, nazywa się serializacją. Korzystanie z metody %@ lub description nie jest dobrym sposobem na przeprowadzenie serializacji. Jeśli naprawdę chcesz deserializować ciąg utworzony metodą description, musisz napisać własny analizator składni. O ile mi wiadomo, nie ma na to API.

Zamiast tego, Cocoa zapewnia system zaprojektowany do serializacji i deserializacji obiektów. Obiekty, które można serializować za pomocą tego systemu, są zgodne z protokołem NSCoding. Obiekty NSAttributedString są zgodne z NSCoding. Więc spróbuj szeregowania oryginalna przypisać ciąg ten sposób:

NSMutableData *data = [NSKeyedArchiver archivedDataWithRootObject:nsattributedstring]; 

Zapisz data (który nie jest czytelny dla człowieka binarny, nie UTF-8) wszędzie tam, gdzie trzeba. Kiedy trzeba odtworzyć nadany ciąg, to zrobić:

NSAttributedString *fancyText = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Jeśli programowania dla OS X (nie iOS), masz alternatywę. Możesz przekształcić przypisany ciąg w RTF (format RTF), który jest czytelny dla człowieka, używając RTFFromRange:documentAttributes: method (który pomija załączniki) lub RTFDFromRange:documentAttributes: method (który zawiera załączniki). Następnie możesz przekształcić dane RTF z powrotem w przypisany ciąg, używając initWithRTF:documentAttributes: lub initWithRTFD:documentAttributes:. Te metody nie są dostępne w systemie iOS.

Jeśli programowania dla iOS 7.0 lub nowszy, można użyć -dataFromRange:documentAttributes:error: lub fileWrapperFromRange:documentAttributes:error: do konwersji przypisać ciąg RTF/RTFD. Musisz ustawić NSDocumentTypeDocumentAttribute na NSRTFTextDocumentType lub NSRTFDTextDocumentType w atrybutach dokumentu. Użyj wartości initWithData:options:documentAttributes:error: lub initWithFileURL:options:documentAttributes:error:, aby przekonwertować ponownie na NSAttributedString. Metody te są częścią NSAttributedString UIKit Additions.

+0

Proszę o odpowiedź. Wiem o NSCoding, ale muszę pobrać UTF-8 z NSAttributedString, ponieważ piszę ciąg do pliku xml UTF-8. Czy jest jakiś sposób, aby to zrobić? –

+1

@ MichalJuriJurník: Nie ma czegoś takiego jak "UTF-8 NSAttributedString". NSAttributedString to ciąg znaków plus atrybuty; możesz zakodować dowolny ciąg jako dane UTF-8, ale nadal musisz serializować atrybuty osobno, a następnie deserializować/dekodować je i wstawiać je z powrotem na drugim końcu. Użyj metod RTF; są do tego zaprojektowane. –

+0

Thx za dobry pomysł;) –