Я пытаюсь создать простой текстовый редактор, такой как Textedit для Mac OS X, но после многих часов исследований не могу понять, как правильно записать данные моего документа в файл. Я использую структуру Cocoa, и мое приложение основано на документах. Просматривая Cocoa API, я нашел краткое руководство «Создание текстового редактора за 15 минут» или что-то в этом роде, в котором реализован следующий метод записи данных в файл:
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
[textView breakUndoCoalescing];
NSAttributedString *string=[[textView textStorage] copy];
NSData *data;
NSMutableDictionary *dict=[NSDictionary dictionaryWithObject:NSPlainTextDocumentType forKey:NSDocumentTypeDocumentAttribute];
data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
return data;
}
Это просто отлично работает, но я бы хотел, чтобы пользователь мог выбрать кодировку текста. Я предполагаю, что этот метод использует «автоматическую» кодировку, но как я могу записать данные, используя предопределенную кодировку? Я попытался использовать следующий код:
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
[textView breakUndoCoalescing];
NSAttributedString *string=[[textView textStorage] copy];
NSData *data;
NSInteger saveEncoding=[prefs integerForKey:@"saveEncoding"];
// if the saving encoding is set to "automatic"
if (saveEncoding<0) {
NSMutableDictionary *dict=[NSDictionary dictionaryWithObject:NSPlainTextDocumentType forKey:NSDocumentTypeDocumentAttribute];
data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
// else use the encoding specified by the user
} else {
NSMutableDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:NSPlainTextDocumentType,NSDocumentTypeDocumentAttribute,saveEncoding,NSCharacterEncodingDocumentAttribute,nil];
data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
}
return data;
}
saveEncoding равно -1, если пользователь не установил конкретную кодировку, в противном случае — одну из кодировок, перечисленных в [NSString availableStringEncodings]. Но всякий раз, когда я пытаюсь сохранить свой документ в кодировке, отличной от UTF8, приложение вылетает. То же самое происходит, когда я пытаюсь закодировать свой документ следующим кодом:
NSString *string=[[textView textStorage] string];
data=[string dataUsingEncoding:saveEncoding];
Что я делаю неправильно? Было бы здорово, если бы кто-нибудь знал, как Textedit решил эту проблему.