15

Photoshop などの一部のアプリケーションでは、ユーザーが Web ブラウザーから画像をドラッグしたり、ファイルシステムからファイルをドック内のアプリケーションのアイコンにドラッグしたりできます。これを行うと、そのアプリケーションでファイルが開きます。

これはどのように行われますか?Cocoa と Objective-C を使用したいのですが、任意の言語の任意のソリューションに興味があります。

4

2 に答える 2

21

NSApplication を使用すると、アプリケーションのデリゲートを設定できます。ユーザーがドック アイコンにファイルをドラッグすると、NSApplication はメソッドを呼び出します。

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename

そのようなメソッドを実装する場合に備えて、デリゲート オブジェクトの。コンテンツが実際にはファイルではない場合 (たとえば、ユーザーがアプリケーションでテキストを選択してドック アイコンにドラッグした場合)、デリゲート メソッド

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

と呼ばれます。

NSApplication クラスのリファレンスを参照してください

基本的に、任意の種類のオブジェクト (NSObject を継承する単純なものなど) を作成し、オブジェクト内で上記の 2 つのメソッドを定義してから、アプリの起動コードの任意の場所で定義できます。

whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];

以上です。ファイルまたはその他のコンテンツがドック アイコンにドロップされるとすぐに、適切なメソッドが呼び出され、その要求を処理する必要があります。ところで、アプリケーションがファイル タイプ (.myFileType など) に関連付けられていて、ユーザーが Finder でその拡張子のファイルをダブルクリックすると、同じメソッドが呼び出されます。

バックグラウンドで実際に行われているのは、Launch Services がアプリケーションに「ドキュメントを開く」(「odoc」) Apple Event を送信することです。デフォルトでは、NSApplication はこのイベントのハンドルを登録し、適切なデリゲート メソッドを呼び出してリクエストを転送します。この Apple Event を直接聞くこともできると思いますが、なぜ聞くのでしょうか? Apple Events を直接扱うのは厄介です。アプリケーションが Cocoa ではなく Carbon (plain-C) の場合、Apple Event を直接処理する必要があるかもしれません (私は Carbon に詳しくありません)。アプリケーションがリッスンできるデリゲート呼び出しまたは通知に変換します。

于 2009-02-03T12:48:58.217 に答える
6

アプリケーションがドキュメントベースで、Info.plist に必要なキーを正しく入力していれば、問題なく動作します。ユーザーがファイルをアプリケーションの Dock タイルにドラッグすると、そのファイルがサインアップしたタイプの場合、Dock はタイル上のアプリを強調表示し、ユーザーがファイルをそこにドロップすると、NSDocumentController はドキュメント クラスの 1 つをインスタンス化します。ファイル。ファイルがサインアップしたタイプでない場合、両方がそれを無視します。

では、あなたのアプリはドキュメント ベースですか? もしそうなら、ファイルはあなたがサインアップしたタイプのものですか?

詳細については:

于 2009-02-01T19:22:52.090 に答える