1

我正在尝试为 Mac OS X 创建一个简单的文本编辑器,如 Textedit,但经过数小时的研究后,无法弄清楚如何正确地将我的文档数据写入文件。我正在使用 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 如何解决这个问题,那就太好了。

4

1 回答 1

1

也许你还记得 NSDictionary 只能存储对象...

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
  NSPlainTextDocumentType,
    NSDocumentTypeDocumentAttribute,
  [NSNumber numberWithInteger:saveEncoding],
    NSCharacterEncodingDocumentAttribute,
  nil];
于 2011-03-12T10:53:15.330 回答