2

アプリケーションデリゲートの「開く」メニューコマンドのハンドラーを書き直すのはとても上手だと思いました。

- (IBAction)openDocument:(id)sender {
    NSOpenPanel * const  panel = [NSOpenPanel openPanel];

    panel.allowsMultipleSelection = YES;
    panel.delegate = self;
    [panel beginWithCompletionHandler:^(NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {
            NSMutableArray * const  paths = [NSMutableArray arrayWithCapacity:panel.URLs.count];

            for (NSURL *file in panel.URLs) {
                [paths addObject:file.path];
            }
            [self application:NSApp openFiles:paths];
        }
    }];
}

古いコードでは、各ファイル URL をループして、ウィンドウ作成コードを直接呼び出していました。次に、単一ファイルの実装をその複数ファイルのバリアントに交換し、-application:openFile:そのコードを 内で再利用することにしました-openDocument:

大丈夫だと思いました。

単一ファイル バージョンは、成功を示す BOOL を返します。マルチファイル バージョンでは、アプリケーション オブジェクトの特別な関数を呼び出す必要があります。

いくつかのファイルでアプリを起動すると、Cocoa のハンドラーはファイルを開く AppleEvent でそれらを調べ、 を呼び出し-application:openFiles:、応答グローバルが設定されるのを待ってから、AppleEvent 応答を返します。で再利用-application:openFiles:すると-openDocument、アプリケーション オブジェクトが期待していないときにそのグローバルに投稿します....ああ、くそ。

ああ、ファイルをオープンファイル AppleEvent に入れて自分自身に送信することで、ファイルを送信して処理することができました。ドキュメントに目を通すと、必要なもの以外はすべて表示されます。AppleEvent の送信方法と、可能な AppleEvents とそのパラメータのリストです。

オープンファイルの AppleEvent を作成して送信する方法を説明してくれる人はいますか? または、少なくともイベント ID とパラメーターのテーブルがどこにあるか教えてください。(スクリプトに関するさまざまな Cocoa ガイドは、イベント ID リファレンスを参照していますが、これは無効なリンクであり、Apple の開発者ポータルの一般/検索ページにつながっています。)

4

1 に答える 1

3

私はちょうど推測した:

- (IBAction)openDocument:(id)sender {
    NSOpenPanel * const  panel = [NSOpenPanel openPanel];

    panel.allowsMultipleSelection = YES;
    panel.delegate = self.openPanelDelegate;
    [panel beginWithCompletionHandler:^(NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {
            NSAppleEventDescriptor * const   fileList = [NSAppleEventDescriptor listDescriptor];
            NSAppleEventDescriptor * const  openEvent = [NSAppleEventDescriptor appleEventWithEventClass:kCoreEventClass eventID:kAEOpenDocuments targetDescriptor:nil returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];

            for (NSURL *file in panel.URLs) {
                [fileList insertDescriptor:[NSAppleEventDescriptor descriptorWithDescriptorType:typeFileURL data:[[file absoluteString] dataUsingEncoding:NSUTF8StringEncoding]] atIndex:0];
            }
            [openEvent setParamDescriptor:fileList forKeyword:keyDirectObject];
            [[NSAppleEventManager sharedAppleEventManager] dispatchRawAppleEvent:[openEvent aeDesc] withRawReply:(AppleEvent *)[[NSAppleEventDescriptor nullDescriptor] aeDesc] handlerRefCon:(SRefCon)0];
        }
    }];
}

「NSAppleEventManager.h」と「NSAppleEventDescriptor.h」のドキュメントを見て、1990 年代に読んだ Mac プログラミング資料を半分覚えています。

また、Apple の Developer Portal / Xcode の Legacy/Retired Documents セクションも調べました。

于 2014-08-25T15:58:08.640 に答える