我正在尝试为 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 如何解决这个问题,那就太好了。