Я пытаюсь создать простой текстовый редактор, такой как Textedit для Mac OS X, но после многих часов исследований не могу понять, как правильно записать данные моего документа в файл. Я использую инфраструктуру Какао, и мое приложение основано на документах. Оглядываясь в 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 решил эту проблему.