1

FinderSync 拡張機能に単純なコンテキスト メニューを実装しようとしています。

いくつかの例を使用して以下を作成しましたが、メニュー項目をクリックしてもコールバックが呼び出されないという問題があります。

ソースコード:

ContextMenuHelper.h

#import <Foundation/Foundation.h>
#include "FinderSync.h"

@interface ContextMenuHelper : NSObject

+ (NSMenu *)buildMenu;

@end

ContextMenuHelper.m

#import "ContextMenuHelper.h"

#define SharedContextMenuTarget  [ContextMenuTarget sharedInstance]

@interface ContextMenuTarget : NSObject
+ (ContextMenuTarget *) sharedInstance;
@end

@implementation ContextMenuTarget

- (void) callback              : (id)sender {
    NSLog(@"Called back!!!");
}

+ (ContextMenuTarget *) sharedInstance
{
    static ContextMenuTarget *sharedContextMenuTarget = nil;
    @synchronized(self)
    {
        if (!sharedContextMenuTarget)
            sharedContextMenuTarget = [[ContextMenuTarget alloc] init];
        return sharedContextMenuTarget;
    }
}

@end

@implementation ContextMenuHelper

+ (NSMenu *)buildMenu
{
    ContextMenuTarget *contextMenuTarget = SharedContextMenuTarget;

    NSMenu *mySubmenu = [[NSMenu alloc] initWithTitle:@""];

    NSMenuItem *newMenu = [[NSMenuItem alloc] initWithTitle:@"hello"
                                                     action:@selector(callback:)
                                              keyEquivalent:@""];
    [newMenu setTarget:contextMenuTarget];
    [mySubmenu addItem:newMenu];

    return mySubmenu;
}

@end

MyFinderSync.m

...
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu {

    NSMenu *myContextMenu = [[NSMenu alloc] initWithTitle:@""];

    @try
    {
        if(whichMenu != FIMenuKindContextualMenuForItems) {
            return myContextMenu;
        }

        myContextMenu = [ContextMenuHelper buildMenu];
    }
    @catch (NSException *ex)
    {
    }

    return myContextMenu;
}
...
4

1 に答える 1

2

どうやら、コールバックは、ターゲットが のインスタンスである場合にのみ機能しますFinderSync。この理論を裏付けるドキュメントは見つかりませんでしたが、コンテキスト メニューのコードをMyFinderSync.mに移動するだけで問題が解決しました。

...
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu {

    NSMenu *myContextMenu = [[NSMenu alloc] initWithTitle:@""];

    @try
    {
        if(whichMenu != FIMenuKindContextualMenuForItems) {
            return myContextMenu;
        }

        myContextMenu = [self buildMenu];
    }
    @catch (NSException *ex)
    {
    }

    return myContextMenu;
}

- (NSMenu *)buildMenu
{
    NSMenu *mySubmenu = [[NSMenu alloc] initWithTitle:@""];

    NSMenuItem *newMenu = [[NSMenuItem alloc] initWithTitle:@"hello"
                                                     action:@selector(callback:)
                                              keyEquivalent:@""];
    [newMenu setTarget:self];
    [mySubmenu addItem:newMenu];

    return mySubmenu;
}

- (void) callback              : (id)sender {
    NSLog(@"Called back!!!");
}
...
于 2015-08-09T16:08:05.160 に答える