Как сохранить текстовый документ в Какао с указанной кодировкой NSString? - PullRequest
1 голос
/ 12 марта 2011

Я пытаюсь создать простой текстовый редактор, такой как 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 решил эту проблему.

1 Ответ

1 голос
/ 12 марта 2011

Возможно, вы помните, что NSDictionary может хранить только объекты ...

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
  NSPlainTextDocumentType,
    NSDocumentTypeDocumentAttribute,
  [NSNumber numberWithInteger:saveEncoding],
    NSCharacterEncodingDocumentAttribute,
  nil];
...