2017-04-19 6 views
2

Je suis en train de créer une application macOS avec Finder Sync Extension, qui ajoute un élément de la barre d'outils au Finder.Comportement bizarre du menu des éléments de la barre d'outils du Finder Sync Extension

J'ai créé la barre d'outils menu élément comme celui-ci:

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu { 
    NSMenu *menu = [NSMenu new]; 

    NSURL *URL = ...// Create a NSURL dynamically 

    NSMenuItem *item = [NSMenuItem new]; 
    [item setTitle:@"foo"]; 
    [item setRepresentedObject:URL]; 
    [item setTarget: self]; 
    [item setAction:@selector(itemClicked:)]; 

    [menu addItem:item]; 

    return menu; 
} 

- (void)itemClicked:(NSMenuItem *)item { 
    NSLog(@"%@", item.representedObject); 
} 

L'article a fait apparaître avec le titre « foo », mais quand je clique dessus (null) a été imprimé.

J'ai également essayé de créer une sous-classe de NSMenuItem avec @property (NSURL*) URL et de définir la propriété URL lorsque je crée l'élément, mais après le clic, la propriété URL redevient nulle.

Alors qu'est-ce qui a mal tourné ici?

Répondre

1

Les éléments de menu et de menu affichés lorsque vous faites un clic droit dans le Finder sont copies des éléments de menu que vous indiquez dans menu(for menu: FIMenuKind).

Toutes les propriétés de votre élément de menu ne survivront pas à la copie, ce qui correspond à la valeur nil que vous obtenez pour representedObject. Une sous-classe NSMenuItem ne sera certainement pas conservée.

Voir l'en-tête FinderSync pour plus d'informations d'Apple:

optional public func menu(for menu: FIMenuKind) -> NSMenu?

propriétés des éléments de menu spécifiques sont utilisés: title, action, image et enabled. A partir de 10.11: tag, state et indentationLevel fonctionnent également, et les sous-menus sont autorisés.

aide d'une chaîne title de l'élément de menu ou tag pour déterminer l'URL nécessaire est probablement la meilleure option disponible.

+1

Thx! Je finis par enregistrer les URL sous la forme d'un tableau dans NSUserDefaults et définir la balise de chaque élément comme l'index de son URL dans le tableau. –