NSTextView
(この質問は、いくつかのさらなる調査に続く問題から書き直されました)
更新: ここで問題を表示する非常に基本的なプロジェクトをダウンロードできます。
http://w3style.co.uk/~d11wtq/DocumentApp.tar.gz
(grep -c "\r" file.txt
保存したファイルに対してa を実行して、\r
発生する行数を取得します... を繰り返します\n
)。
私の文書サブクラスの戻り値には が含まれていなくても、のみが含まれてNSDocument
い\r
ます。これを設定する方法はありますか?\n
NSData
\r
\n
最近の Mac は UNIX の行末を使用していると思っていたので、AppKit がまだ時代遅れの Mac の行末を使用しているのは奇妙に思えます。奇妙なのは、 をNSDocument
要求し、行末を変換するNSData
ことによって、かなり不親切にそれを破壊することです。NSData
への切り替え\r
はの生成後NSData
に行われるため、それNSDocument
自体がバイトに対していくつかの置換を行っています。
const char *bytes = [data bytes];
int i, len;
for (i = 0, len = [data length]; i < len; ++i) {
NSLog(@"byte %d = %02x", i, bytes[i]);
}
出力 (注 0a は の 16 進値です\n
):
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 0 = 66
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 1 = 6f
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 2 = 6f
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 3 = 0a
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 4 = 62
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 5 = 61
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 6 = 72
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 7 = 0a
が要求する場合NSDocument
はNSData
、それを尊重し、変更しないでください。
-dataOfType:error:
私のドキュメントの method: method の完全なコードは次のとおりです。
-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
NSString *string = [textView string];
// DEBUG CODE...
NSArray *unixLines = [string componentsSeparatedByString:@"\n"];
NSArray *windowsLines = [string componentsSeparatedByString:@"\r\n"];
NSArray *macLines = [string componentsSeparatedByString:@"\r"];
NSLog(@"TextView has %d LF, %d CRLF, %d CR", [unixLines count] - 1, [windowsLines count] - 1, [macLines count] - 1);
NSData *data = [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding]
length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
const char *bytes = [data bytes];
int i, len;
for (i = 0, len = [data length]; i < len; ++i) {
NSLog(@"byte %d = %02x", i, bytes[i]);
}
if (data != nil) {
[textView breakUndoCoalescing];
}
return data;
}