6

私のアプリケーションはインポートするが保存しないファイルタイプがあります。ドキュメント タイプにエントリを追加して読み取り専用に設定しましたが、探しているインポート動作が得られません。代わりに、私のアプリはファイルを開くだけで、元のファイルを保存すると、独自のファイル形式で上書きされます。

元のドキュメントを開くのではなく、元のドキュメントのデータを使用して新しいドキュメントが作成されるようにドキュメントまたはドキュメント タイプを設定する方法を教えてください。

4

3 に答える 3

13

1. ファイル タイプをドキュメント タイプとして宣言する

Xcode プロジェクト内で、アプリケーションがサポートするすべてのファイル形式のドキュメント タイプを追加します。アプリケーションの能力に応じて、各タイプの役割を設定します。

  • 読み取り/書き込み可能なファイル タイプをEditorとしてマークします。
  • インポートのみのファイル タイプをViewerとしてマークします。

各ファイル タイプを処理するドキュメント タイプにクラスを設定します。1 つのドキュメント クラスで複数のファイル タイプを処理できます。

以下の例では、font-pestle、otf、および ttf の 3 つのファイル タイプが宣言されています。最初の font-pestle は、アプリケーションのネイティブ形式です。このタイプには、役割Editorがあります。

残りの 2 つの形式 (otf と ttf) はインポートできますが、アプリケーションで書き込むことはできません。したがって、それらはViewerとしてマークされます。

文書タイプの例

2. NSDocument サブクラスの追加のファイル タイプ

ドキュメント タイプが追加されると、アプリケーションは、ユーザーが指定されたタイプのファイルを開くことを自動的に許可します。

ドキュメント クラスにファイル タイプ処理コードを追加する必要があります。理想的なケースでは、分岐コードをreadFromData:ofType:error:メソッドに追加します。

- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError
{
    if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES)
    {
        // read native format
    }
    else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES)
    {
        // read import only format

        // disassociate document from file; makes document "untitled"
        self.fileURL = nil;
        // associate with primary file type
        self.fileType = @"eu.miln.font-pestle";

    }
    else // ...

}

self.fileURL = nil;が重要です。fileURL を nil に設定すると、ドキュメントがディスク上のファイルに関連付けられておらず、新しいドキュメントとして扱われるべきであると言えます。

自動保存を許可するには、NSDocument メソッドを実装しautosavingFileTypeてプライマリ ファイル タイプを返します。

于 2013-04-02T14:16:50.940 に答える
4

アレックス、あなたの答えに感謝しますが、私はもう少し好きな方法を見つけました:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
               error:(NSError **)outError
{
    *outError = nil;
    if ([typeName isEqualToString:@"SomeReadOnlyType"])
    {
        // .. (load data here)
        [self setFileURL:nil];

        return result;
    }
    else
    {
        // .. (do whatever you do for other documents here)
    }
}

このようにして、独自のドキュメント システムを作成する代わりに、Cocoa が提供するドキュメント システムを使用することができます。

ここにも解決策を文書化しました: http://www.cocoadev.com/index.pl?CFBundleTypeRoleページの少し下。

于 2009-06-16T08:54:36.803 に答える
1

Cocoa でインポート機能がデフォルトでサポートされているとは思えません。ユーザーが開いているパネルの [開く] ボタンをクリックすると、フレームワークはopenDocumentWithContentsOfURL:display:error:on を呼び出しますNSDocumentController。ここで、ドキュメント システムは、開いているファイルの種類を判断し、Info.plist ファイルを参照しNSDocumentて、ドキュメントを開くために使用するサブクラスを判断します。

メソッドをサブクラス化NSDocumentControllerし、オーバーライドしてopenDocumentWithContentsOfURL:display:error:、開くのではなくインポートする必要があるファイルの種類をインターセプトすることができます。NSDocumentサブクラスで、initWithImportedContentsOfURL:type:error:新しい無題のドキュメントを作成し、インポートされたファイルの内容を読み取るために、(または、より適切な名前の :-) のような名前の新しいイニシャライザを記述します。

于 2009-06-11T13:47:12.890 に答える