2014-12-07 16 views
7

Ho implementato un'estensione Finder Sync in base al campione fornito da Apple.Finder Sync: il mittente trasmesso all'azione è un'altra istanza di NSMenuItem

Dopo aver fatto clic sulla voce di menu contestuale appena creata, viene eseguita l'azione corrispondente sampleAction. Sfortunatamente il mittente trasmesso al metodo non corrisponde all'istanza creata in menuForMenuKind.

Il codice

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu 
{ 
    NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:@"testTitle" action:@selector(sampleAction:) keyEquivalent:@""]; 
    menuItem.tag = 1; 

    // print menu attributes 
    NSLog(@"------------------original menu-----------------"); 
    NSLog(@"menu address: %p", menuItem); 
    NSLog(@"menu tag: %ld", menuItem.tag); 
    NSLog(@"menu title: '%@'", menuItem.title); 

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; 
    [menu addItem:menuItem]; 

    return menu; 
} 

- (IBAction)sampleAction:(id)sender 
{ 
    if([sender isKindOfClass:[NSMenuItem class]]) 
    { 
     NSMenuItem* menuItem = sender; 

     NSLog(@"------------------menu passed to action-----------------"); 
     NSLog(@"menu address: %p", menuItem); 
     NSLog(@"menu tag: %ld", menuItem.tag); 
     NSLog(@"menu title: '%@'", menuItem.title); 
    } 
} 

risultati nel seguente output dopo che ho cliccato sul elemento nel menu di scelta rapida

2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] ------------------original menu---------------- 
2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] menu address: 0x6080000abbe0 
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu tag: 1 
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu title: 'testTitle' 
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] ------------------menu passed to action---------------- 
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu address: 0x6080000aba00 
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu tag: 0 
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu title: '' 

.

C'è qualche possibilità di collegare il mittente alla voce di menu, su cui è stato fatto clic?

+0

Avete qualche soluzione per questo? –

+0

Non ancora, sfortunatamente :( –

+0

hmm lascia che Apple conosca le tue esigenze usando il sistema di segnalazione bug di Apple. Ora sto usando un selettore diverso per voci di menu differenti. –

risposta

7

Per riferimento, si tratta di un comportamento apparentemente intenzionale. Ho presentato un bug report con Apple, e questa è stata la loro risposta:

Questo problema si comporta come previsto in base alla seguente:

Finder Sync non tenere tutto il NSMenuItem specifica * istanze e proprietà molto pochi sono rispettati (solo titolo, azione, immagine e abilitato). In una versione futura, è probabile che la proprietà -tag sia supportata, ma non -presentataOggetto. - Se è necessario un insieme dinamico di azioni, dovrebbe essere possibile utilizzare funzioni come sel_registerName e method_setImplementation (in) per creare metodi in fase di esecuzione.

1

I documenti FIFinderSyncController/FIFinderSyncProtocol offrono la migliore documentazione per questi menu e metodi che riesco a trovare.

menu(for menu: FIMenuKind)

specifiche proprietà della voce di menu da utilizzare sono: titolo, azione, immagine, e abilitati.

A partire da 10.11: tag, stato e indentationLevel funzionano anche e sono consentiti i sottomenu.

La proprietà tag che non è stata mantenuta quando è stata fatta questa domanda è ora persistente in macOS 10.11+.

La proprietà representedObject è non persistente dal momento in cui si ottiene il callback, che sarebbe estremamente utile. L'oggetto NSMenuItem è diverso anche da quel punto.

Non è l'ideale, ma il campo ora persistente (e invisibile all'utente) tag dovrebbe essere sufficiente per passare le informazioni dalla creazione del menu e dalla richiamata dell'azione.