1

NSTextView(この質問は、いくつかのさらなる調査に続く問題から書き直されました)

更新: ここで問題を表示する非常に基本的なプロジェクトをダウンロードできます。

http://w3style.co.uk/~d11wtq/DocumentApp.tar.gz

(grep -c "\r" file.txt保存したファイルに対してa を実行して、\r発生する行数を取得します... を繰り返します\n)。

私の文書サブクラスの戻り値には が含まれていなくても、のみが含まれてNSDocument\rます。これを設定する方法はありますか?\nNSData\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

が要求する場合NSDocumentNSData、それを尊重し、変更しないでください。

-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;
}
4

1 に答える 1

1

NSDocument は行末を気にしません。これは、サブクラス化するように設計された半抽象クラスです。それ自体は、ファイル形式に何も課しません。

これは、NSDocument サブクラスの特定の実装 (たまたまプレーン テキストを読み書きするサブクラス) であり、行末文字を考慮します。

于 2010-12-17T04:02:10.110 に答える