Cocoa でインポート専用のドキュメント タイプを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/979647

  •  13-09-2019
  •  | 
  •  

質問

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

元のドキュメントを開くのではなく、元のドキュメントのデータを使用して新しいドキュメントを作成するようにドキュメントまたはドキュメント タイプを設定するにはどうすればよいですか?

役に立ちましたか?

解決

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

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

  • 読み取り/書き込み可能なファイル タイプを次のようにマークします 編集者;
  • インポートのみのファイルタイプとしてマークを付ける ビューア.

をセットする クラス 各ファイルタイプを処理したい文書タイプに合わせて選択します。1 つのドキュメント クラスで複数のファイル タイプを処理できます。

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

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

Example Document Types

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 プライマリ ファイル タイプを返します。

他のヒント

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

- (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)
    }
}
それは代わりに自分の圧延foはココアが提供するドキュメント・システムを使用することは可能です。

この方法

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

私は、インポート機能がココアではデフォルトでサポートされていることを信じていません。ユーザーが開いたパネルで[開く]ボタンをクリックすると、フレームワークはopenDocumentWithContentsOfURL:display:error:NSDocumentControllerを呼び出します。ドキュメントシステムは、文書を開くために使用するNSDocumentサブクラスを把握するためにあなたがInfo.plistファイルを開くと協議しているファイルの種類を割り出しところです。

あなたはNSDocumentControllerをサブクラス化し、輸入ではなく、開くべきファイルタイプを傍受するopenDocumentWithContentsOfURL:display:error:メソッドをオーバーライドすることができます。あなたのNSDocumentのサブクラスでは、新しい無題のドキュメントを作成し、インポートしたファイルの内容を読み取るために(よりよい名前:-)を持つか何か)initWithImportedContentsOfURL:type:error:ような名前を持つ新しい初期化子を書きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top