Finder のコンテキスト メニューにメニュー項目を追加するアプリケーションがあります。
現在、私のメニュー項目は、選択した項目に対して表示されます。
フィルタリングを実行し、特定のパスのメニュー項目を表示したくない。
Apple のサービス実装ガイド1の指示に従っていると思いますが、これを達成することができませんでした。
私の理解では、フィルタリング ロジックはレスポンダーのvalidRequestorForSendType
メソッドで実行する必要があります。私の問題は、このメソッドが呼び出されないことです。そのため、レスポンダーチェーンに登録されていないと想定していますが、何が欠けているのかわかりません。
私はOSXを初めて使用し、このコードを継承したため、手がかりを提供する可能性のある追加のコンテキストを次に示します。
アプリケーションの唯一の UI 存在は、システム メニュー バーのトレイ アイコンです。NSApplication からは何も派生しません (私が理解しているように、これは NSResponder です)。NSObject <NSApplicationDelegate>
サービス プロバイダーが設定されている場所から派生する AppDelegate というクラスがあります。このapplicationDidFinishLaunching
クラスでは:
- MyResponder (NSResponder から派生) インスタンスを割り当てます
- NSRegisterServicesProvider(myResponder, @" portName from my Info.plist ")
- [NSApp setServicesProvider:myResponder]
- NSUpdateDynamicServices()
MyResponder の関数では、Info.plist にリストされているサービス関数をinitialize()
呼び出し[NSApp registerServicesMenuSendTypes]
て定義します。validRequestorForSendType
前述のように、アプリケーションを実行し、Finder を開き、パスをクリックしてアプリケーションのメニュー項目を取得しますが、MyRespondervalidRequestorForSendType
が呼び出されないため、それをフィルタリングする機会がありません。
私が欠けているものについてのアイデアはありますか? スキップした XCode の xib ビューアーで何かを配線する必要がありましたか?