4

非ドキュメントベースのCocoaアプリで[最近開いたメニュー]の項目をクリックしたユーザーに応答しようとしています。IBのIBActionに添付することで、[ファイル]->[開く]を処理できます。ただし、ユーザーが[最近]リストから何かをクリックしたときの処理方法がわかりません。ある種の代理人が必要ですか?

4

1 に答える 1

10

これは少し遅いかもしれませんが、万一、まだ答えが必要な場合があります:

[NSDocumentController sharedDocumentController]私はすべてのリフティングを行うために使用します。ドキュメントはこちらです。プロジェクトはドキュメントベースである必要はありません。

ヘッダーに NSDocumentController 変数を設定します。

NSDocumentController *theDocCont;

次に、メインの AppDelegate ファイルに次のようなものを実装します。

-(void)addToRecent:(NSArray*)URLs
{
    if (!theDocCont) {
        theDocCont = [NSDocumentController sharedDocumentController];
    }
    [URLs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [theDocCont noteNewRecentDocumentURL:obj];
    }];
}

-(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
    [self openItems:filenames addToRecents:NO]; //see later
}

[self addItems:[myNSOpenPanel URLs] addToRecents:YES];NSOpenPanelの完了ブロックから呼び出すことで、Recents メニューに追加できるようになりました。

基本的に、-addToRecent:メソッドには NSURL の NSArray を指定する必要があります。次に、それらは-noteNewRecentDocumentURL:.

アプリの実行中にそのメニューの項目をクリックすると、OS は実装を探します-application:openFiles:(見つからない場合は、「yourApp はこの種類のファイルを開くことができません」という行に沿って NSAlert が表示されます)。 )。fileNamesNSURL の NSArray になります。

おそらく、URL の開始を別の方法で処理したいと思うでしょうが、(最初に行ったように) への呼び出し中に最近のアイテムを追加しようとする小さな問題を強調しているため、私のものを示しました-application:openFiles:。私のプロジェクトでは、アプリのさまざまな部分から呼び出される URL のオープンを処理するための共通のメソッドがあり、デフォルトでは、開いている URL を最近使用したリストに追加します。しかし、「最近使ったものを開く」メニューから既に来ているアイテムを再度追加したくないのでaddToRecents:、署名の一部の理由です。そうしようとすると、クラッシュが発生します - 無限のフィードバック ループのようなものだと思います。

于 2013-01-09T13:06:28.877 に答える