Photoshop などの一部のアプリケーションでは、ユーザーが Web ブラウザーから画像をドラッグしたり、ファイルシステムからファイルをドック内のアプリケーションのアイコンにドラッグしたりできます。これを行うと、そのアプリケーションでファイルが開きます。
これはどのように行われますか?Cocoa と Objective-C を使用したいのですが、任意の言語の任意のソリューションに興味があります。
Photoshop などの一部のアプリケーションでは、ユーザーが Web ブラウザーから画像をドラッグしたり、ファイルシステムからファイルをドック内のアプリケーションのアイコンにドラッグしたりできます。これを行うと、そのアプリケーションでファイルが開きます。
これはどのように行われますか?Cocoa と Objective-C を使用したいのですが、任意の言語の任意のソリューションに興味があります。
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 に詳しくありません)。アプリケーションがリッスンできるデリゲート呼び出しまたは通知に変換します。
アプリケーションがドキュメントベースで、Info.plist に必要なキーを正しく入力していれば、問題なく動作します。ユーザーがファイルをアプリケーションの Dock タイルにドラッグすると、そのファイルがサインアップしたタイプの場合、Dock はタイル上のアプリを強調表示し、ユーザーがファイルをそこにドロップすると、NSDocumentController はドキュメント クラスの 1 つをインスタンス化します。ファイル。ファイルがサインアップしたタイプでない場合、両方がそれを無視します。
では、あなたのアプリはドキュメント ベースですか? もしそうなら、ファイルはあなたがサインアップしたタイプのものですか?
詳細については: