Преобразование отформатированного текста NSTextView в NSData (и обратно)
Как мне преобразовать содержимое NSTextView
в NSData
, а затем преобразовать его обратно и отобразить на Mac OS X?
Я могу конвертировать текст без форматирования с помощью textView.textStorage.string
(где textView является NSTextView
объект). Однако я хочу также сохранить форматирование текста.
На самом деле я реализовал подход, который работает, но я не уверен, что он всегда будет работать. Я кодирую NSTextStorage
сам объект и запишите его, а затем прочитать его обратно как NSAttributedString
, (NSTextStorage
это подкласс NSAttributedString
.) Я делаю это, потому что не могу установить напрямую textStorage
для NSTextView
, но я могу установить его атрибутивную строку.
Вот мой код для его преобразования (результат в 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
?
1 ответ
Да, это будет работать. NSTextStorage
будет использовать NSCoding
реализация NSAttributedString
поэтому, когда вы кодируете данные, вы на самом деле будете кодировать NSAttributedString
, Это означает, что вы будете читать данные обратно как неизменный объект, даже если вы написали изменяемый объект.
Очевидно, это нормально, если вы используете setAttributedString:
метод, поэтому вы будете использовать закодированные неизменяемые данные для обновления изменяемого состояния. Это должно работать безупречно, если ваш код сериализации / десериализации верен.