Textedit for 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です。それ以外の場合は、[NSStringavailableStringEncodings]にリストされているエンコーディングの1つです。しかし、UTF8とは異なるエンコーディングでドキュメントを保存しようとすると、アプリがクラッシュします。次のコードでドキュメントをエンコードしようとすると、同じことが起こります。
NSString *string=[[textView textStorage] string];
data=[string dataUsingEncoding:saveEncoding];
私は何が間違っているのですか?テキストエディットがこの問題をどのように解決したかを誰かが知っていれば素晴らしいと思います。