3

ここで非常に奇妙な問題があります。FinderSync 拡張機能を作成しています。具体的には、コンテキスト メニューに要素を追加しています。すべてを 1 つのクラスにまとめると、問題なく動作します。

1) FinderSync と呼ばれるメイン拡張クラスがあります。

2)このクラスでは、実装します

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3)このメソッドでは、(とりわけ)書いています:

NSMenuItem *myItem = [[NSMenuItem alloc]
            initWithTitle:@"myTitle" 
            action:@selector(myAction:)
            keyEquivalent:@""];

4) FinderSync クラスには、メソッドが存在します。

- (IBAction)myAction:(id)sender;

5) ユーザーがメニュー項目をクリックすると、このメソッドが期待どおりに呼び出されます。

現在:コンテキスト メニュー機能を ContextMenuHandler という別のクラスに外注しようとしています。現在の状況:

1) FinderSync と呼ばれるメイン拡張クラスと、ContextMenuHandler と呼ばれる別のクラスがあります。FinderSync は ContextMenuHandler のインスタンスを作成し、それへの参照 (_contextMenuHandler) を保持します。

2) 両方のクラスが実装

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3) menuForMenuKind の FinderSync 実装は、呼び出すだけです。

return [_contextMenuHandler menuForMenuKind:whichMenu];

4) ContextMenuHandler は NSMenuItem を作成します。(まったく同じコード)。私も追加しようとしました:

[myItem setTarget:self];
[myItem setAction:@selector(myAction:)];

どちらのクラスも myAction を実装しています。

5)想定:メニュー項目をクリックすると、ContextMenuHandler の myAction が呼び出されます観察: FinderSync の myAction が呼び出されます...

また、更新後にファインダーを再起動しており、ContextMenuHandler のブレークポイントが正しくヒットしているため、「古い FinderSync バージョンの実行」の問題ではないようです。

この奇妙な動作の説明 (または修正) はありますか?

4

1 に答える 1

0

FIFinderSyncProtocolドキュメントには、いくつかの有用なコンテキストが含まれています 。

menu(for menu: FIMenuKind)

拡張機能のプリンシパル オブジェクトは、各メニュー項目に割り当てられたアクションのメソッドを提供します。

あなたが観察したように、「拡張機能の主要オブジェクト」がアクションメソッドを提供すると述べています。

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

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

NSMenuItemこのサポートされているプロパティのリストに特に欠けているのはtargetです。アクションの特定のターゲットを設定することはできないため、Apple は単純に FinderSync サブクラスでアクションを呼び出します。

property で同様の問題に遭遇しましたrepresentedObject。メニュー項目を として取得するまでは保持されませんsender

于 2016-10-25T09:41:45.583 に答える