2015-08-09 3 views
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; 
} 
... 
+0

Я нашел следующий пример: https://github.com /liferay/liferay-nativity/blob/29650642dea00ea491d906871c285c2b50170758/mac/FinderSync/LiferayFinderSync/RequestManager.m#L149 выглядит намного сложнее, чем моя попытка. Это действительно необходимо? – Mugen

ответ

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!!!"); 
} 
... 
+1

отличная работа, спасибо за фрагменты. – StefanS

Смежные вопросы