0

更新1:近づく

IRCの誰かが、私のNSPortNameはFinderではなく、私のアプリケーションであるべきだと述べました。これを変更しましたが、コンテキストメニューを選択すると、アプリにログメッセージが表示されます。

Cannot find service provider for selector shareFile:userData:error: or shareFile:: for service shareFile

私がそのようなオブジェクトを登録していることを考えると、これは奇妙に思えます。


FinderのNSServiceコンテキストメニューを設定して、特定のファイルでアプリをトリガーしようとしています。

ファイルの拡張子は*.acxxで、アクションは単に共有することです。注:バンドルのすべての参照を、この投稿の一般的なものに変更しました:com.mycompany.myproject。

infoPlistのNSServicesセクションは次のようになります:(*。acxxにもドキュメントタイプ/UTIが設定されていることに注意してください)

<key>NSServices</key>
    <array>
        <dict>
            <key>NSRequiredContext</key>
            <dict>
                <key>NSTextContent</key>
                <array>
                    <string>URL</string>
                    <string>FilePath</string>
                </array>
            </dict>
            <key>NSSendFileTypes</key>
            <array>
                <string>com.mycompany.myproject.acxx</string>
            </array>
            <key>NSPortName</key>
            <string>Finder</string>
            <key>NSMessage</key>
            <string>shareFile</string>
            <key>NSMenuItem</key>
            <dict>
                <key>default</key>
                <string>Share with myproject</string>
            </dict>
        </dict>
    </array>

次のメソッドが定義されたオブジェクトセットアップがコードにあります。

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err

そして、これをコードの他の場所に登録します。

// Register services
if (self.shareSvcMgr == nil)
{
    self.shareSvcMgr = [[ACAShareServiceManager alloc] init];
}
[NSApp setServicesProvider:self.shareSvcMgr];
NSUpdateDynamicServices();

さて、アプリを実行して、それがpbsに登録されていることを確認すると、問題なく表示されます。

/System/Library/CoreServices/pbs -debug en|grep -i myproj
        NSBundleIdentifier = "com.mycompany.myproject";
        NSBundlePath = "/Users/me/Library/Developer/Xcode/DerivedData/myproject-gihhiqhnzhwqbchflymzyafwxvws/Build/Products/Debug/myproject.app";
            default = "Share with myproject";
            "com.mycompany.myproject.acxx"

したがって、Finderに移動して* .acxxファイルをクリックすると、[Finder]-> [サービス]で、メニュー項目[myprojectと共有]が表示されます。

問題:

すべてが元気でダンディですよね?うーん、ダメ。[myprojectと共有]をクリックしても何も起こりません。shareFileメソッドにブレークポイントを設定しましたが、プログラムは実行されていますが、何も起こらず、ヒットすることもありません。

-NSDebugServicesを使用してFinderをデバッグできることを読みましたが、それを正しく機能させることができないようです。私は実行しました:

/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder -NSDebugServices com.mycompany.myproject

これはプロセスを開始するようですが、対話しようとするFinderウィンドウが表示されません。

次にどこに行けばいいのかわからない。もちろん、Shareが送信されたときにファイル名またはファイルの内容をアプリケーションに渡すことで、そこから必要な処理を実行できます。

SendFileTypesは、このモデルに対して正しく設定されていませんか?助けていただければ幸いです。ありがとう

4

2 に答える 2

0

大丈夫。IRCの誰かが、私のメソッド定義に何かが欠けていると指摘しました。

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err

変数定義がありませんでした(セレクターの一致を完全に台無しにする可能性があります)。だからそれはこれだったはずです:

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*)***udata*** error:(NSString**)err

それを変更すると、セレクターはついに呼び出され始めました=)

于 2012-11-19T18:32:08.717 に答える
0

同じ問題が発生し、派生データを削除することでこれを解決できました。

ダミーのアプリを作ってテストしようとしていて、同じメッセージ名を使っていたのではないかと思います。ダミーアプリから派生データを削除することで、すべてが機能し始めました。

次のパスのどこかのディレクトリで派生データを見つけることができるはずです。

~/Library/Developer/Xcode/DerivedData/

古いものを削除すると、解決する可能性があります。

于 2013-11-04T14:09:50.217 に答える