3

如何在Mac OS X上將NSTextView的內容轉換爲NSData,然後將其轉換並顯示出來?將NSTextView格式的文本轉換爲NSData(和後退)

我可以通過使用textView.textStorage.string(其中textView是NSTextView對象)來轉換文本而不進行格式設置。但是,我想保存文本格式。

事實上,我已經實施了一種可行的方法,但我不確定它總是能夠正常工作。我編碼NSTextStorage對象本身並寫入它,然後將它讀回爲NSAttributedString。 (NSTextStorageNSAttributedString的一個子類。)我這樣做是因爲我無法直接爲NSTextView設置textStorage,但我可以設置它的屬性字符串。

這裏是我的代碼轉換它(結果是data):

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];   
[archiver encodeObject:textView.textStorage forKey:@"attrs"]; 
[archiver finishEncoding]; 

讀回:

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
NSAttributedString* theAttrString = [unarchiver decodeObjectForKey:@"attrs"]; 
[unarchiver finishDecoding]; 

,並顯示它:

[textView.textStorage setAttributedString:theAttrString]; 

這種方法保證工作,因爲我編碼了一個NSTextStorage對象並將它讀回來把它解釋爲NSAttributedString

+0

我不明白爲什麼不。這似乎是一個完全有效的序列化方法。然而,這個問題「這是一個好方法嗎?」有點主觀,所以這裏可能不是最好的問題。 –

+0

謝謝 - 我已經編輯了最後一個問題,使其不那麼主觀。 –

回答

2

是的,這將起作用。 NSTextStorage將使用NSAttributedStringNSCoding實現,因此當您對數據進行編碼時,實際上您將編碼爲NSAttributedString。這意味着即使您編寫了一個可變對象,您也會將該數據作爲不可變對象讀取回來。

顯然,如果您使用setAttributedString:方法,那很好,因此您將使用編碼的不可變數據更新可變狀態。只要您的序列化/反序列化代碼是正確的,這應該完美無缺地工作。

+0

太好了,謝謝你的解釋。但是NSTextStorage是否可以定義自己的NSCoding實現,它現在或將來會打破這一點? –

+0

@Radpole不,即使'NSTextStorage'定義了它自己的實現(根據Apple文檔,它目前沒有),因爲結果類仍然擴展了NSAttributedString,所有的方法仍然可以正常工作。睡眠容易。 –