7

Apple から提供されたサンプルに従って、Finder Sync 拡張機能を実装しました。

新しく作成されたコンテキスト メニュー項目をクリックすると、対応するアクションsampleActionが実行されます。残念ながら、メソッドに渡された送信者は、で作成されたインスタンスと一致しませんmenuForMenuKind

コード

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
    NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:@"testTitle" action:@selector(sampleAction:) keyEquivalent:@""];
    menuItem.tag = 1;

    // print menu attributes
    NSLog(@"------------------original menu-----------------");
    NSLog(@"menu address: %p", menuItem);
    NSLog(@"menu tag: %ld", menuItem.tag);
    NSLog(@"menu title: '%@'", menuItem.title);

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
    [menu addItem:menuItem];

    return menu;
}

- (IBAction)sampleAction:(id)sender
{
    if( [sender isKindOfClass:[NSMenuItem class]])
    {
        NSMenuItem* menuItem = sender;

        NSLog(@"------------------menu passed to action-----------------");
        NSLog(@"menu address: %p", menuItem);
        NSLog(@"menu tag: %ld", menuItem.tag);
        NSLog(@"menu title: '%@'", menuItem.title);
    }
}

コンテキストメニューで要素をクリックすると、次の出力が得られます

2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] ------------------original menu----------------
2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] menu address: 0x6080000abbe0
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu tag: 1
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu title: 'testTitle'
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] ------------------menu passed to action----------------
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu address: 0x6080000aba00
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu tag: 0
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu title: ''

.

クリックされたメニュー項目に送信者をリンクする機会はありますか?

4

2 に答える 2

8

参考までに、これは明らかに意図された動作です。Apple にバグ レポートを提出したところ、次のような回答がありました。

この問題は、以下に基づいて意図したとおりに動作します。

Finder Sync は特定の NSMenuItem* インスタンスを保持しません。また、尊重されるプロパティはほとんどありません (タイトル、アクション、画像、有効化のみ)。将来のリリースでは、-tag プロパティはサポートされる可能性がありますが、-representedObject はサポートされません。— アクションの動的なセットが必要な場合は、sel_registerName や method_setImplementation (の) などの関数を使用して、実行時にメソッドを作成できる必要があります。

于 2015-07-23T19:43:11.543 に答える
2

FIFinderSyncController/ FIFinderSyncProtocoldocs は、私が見つけることができるこれらのメニューとメソッドに関する最高のドキュメントを提供します。

menu(for menu: FIMenuKind)

特定のメニュー項目プロパティが使用されます: title、action、image、および enabled。

10.11 以降: tag、state、および indentationLevel も機能し、サブメニューが許可されます。

このtag質問をしたときに永続化されなかったプロパティは、macOS 10.11 以降で永続化されました。

representedObjectプロパティは、コールバックを取得するまで永続化されていないため、非常に便利です。NSMenuItem オブジェクトもその点で異なります。

理想的ではありませんが、永続化された (そしてユーザーには見えない)tagフィールドは、メニュー作成とアクション コールバックからの情報を渡すのに十分なはずです。

于 2016-12-07T00:05:07.640 に答える