Как сохранить текстовый документ в Cocoa с указанной кодировкой NSString?

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


person Nickkk    schedule 12.03.2011    source источник


Ответы (1)


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

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
  NSPlainTextDocumentType,
    NSDocumentTypeDocumentAttribute,
  [NSNumber numberWithInteger:saveEncoding],
    NSCharacterEncodingDocumentAttribute,
  nil];
person kennytm    schedule 12.03.2011
comment
Большое спасибо, это было так очевидно ... Во всяком случае, теперь все работает отлично! ;-) - person Nickkk; 12.03.2011