2009-09-02 7 views
7

J'ai essayé d'obtenir NSServices de travail pour mon application récemment sans succès. Je l'ai configuré selon la documentation mais il n'apparaît pas dans le menu services (cependant il apparaît dans la section des raccourcis clavier des Préférences Système en tant qu'élément de menu de service) Quoi qu'il en soit, je mets le service dans mon contrôleur d'application comme ceci :NSServices ne fonctionne pas

[NSApp setServicesProvider:self]; 

La méthode exposée est:

- (void) addDownloadService:(NSPasteboard *)pboard 

    userData:(NSString *)userData error:(NSString **)error 

Mon Info.plist ressemble alors à ceci:

<key>NSServices</key> 
     <array> 
       <dict> 
         <key>NSReturnTypes</key> 
         <array> 
           <string></string> 
         </array> 
         <key>NSKeyEquivalent</key> 
         <dict> 
           <key>English</key> 
           <string>S</string> 
           <key>Key equivalent (with command and shift)</key> 
           <string>S</string> 
         </dict> 
         <key>NSSendTypes</key> 
         <array> 
           <string>NSStringPboardType</string> 
           <string>NSURLPboardType</string> 
           <string>NSRTFPboardType</string> 
         </array> 
         <key>NSPortName</key> 
         <string>MyApp</string> 
         <key>NSMessage</key> 
         <string>addDownloadService</string> 
         <key>NSMenuItem</key> 
         <dict> 
           <key>English</key> 
           <string>MyNewService</string> 
           <key>default</key> 
           <string> MyNewService </string> 
         </dict> 
       </dict> 
     </array> 

I tri ed exécutez la commande de débogage avec TextEdit comme ceci: /Applications/TextEdit.app/Contents/MacOS/TextEdit -NSDebugServices com.companyname.MyApp

qui produit les éléments suivants: MyNewService (com.companyname.MyApp) est désactivé dans le menu des services et désactivé dans le menu contextuel, par la stratégie de services standard.

Quelqu'un a-t-il des idées pour lesquelles cela pourrait ne pas fonctionner?

Merci Colin

Répondre

8

Je viennent de passer creux le même problème. Il semble que Snow Leopard désactive les services tiers par défaut.

Vous devez ouvrir les Préférences> Clavier Sélectionnez le deuxième onglet (quelque chose de rapide, je ne me souviens pas en ce moment), sélectionnez les Services, recherchez les vôtres et activez-les.

Aucune autre solution de contournement à ma connaissance.

4

Le fait qu'il apparaît dans les préférences du système est bon. Tu es presque là. En supposant que vous l'avez déjà activé dans les préférences du système (une bonne chose pour vérifier vraiment rapide, assurez-vous qu'il ya contrôle à côté), le problème est très probablement un problème avec l'envoi et le retour ou types.

OSX utilise les types send et return comme indicateurs pour décider quand et où afficher le service. Par exemple, si vous avez spécifié un type de retour (comme vous l'avez fait ici) et que le contrôle dont vous activez le service ne sait pas quoi faire avec le type de retour, votre service ne sera pas affiché.

Les services de guide de mise en œuvre m'a donné pas tirer sur une bonne difficulté comment découvrir pourquoi mes services n'a pas été affiché quand j'ai eu récemment le même problème (voir https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/SysServices/Articles/properties.html)

Si votre service est reconnu par pbs, mais ne figure pas dans le menu services, vous pouvez utiliser la valeur par défaut de l'utilisateur de NSDebugServices pour aider déterminer pourquoi.Par exemple, pour déterminer pourquoi les services de courrier apparaissent ou ne figurent pas dans TextEdit, vous pouvez lancer TextEdit avec l'option de NSDebugServices et transmettre l'identificateur de paquet de Mail:

/Applications/TextEdit.app/Contents/MacOS/ TextEdit -NSDebugServices com.apple.mail

Quand je l'ai fait j'ai eu un beau message d'erreur pour ma propre application:

MyExampleService (com.blah.example) est disqualifié parce que son envoyer et/ou type de retour s ne peuvent pas être traitées par le demandeur < NSTextView: 0x7fb681c0e8a0 >

Je trouve que mon service apparaîtraient si je n'ai pas précisé et le type de retour, et le message d'erreur montre clairement que le type de retour est le problème dans mon cas. Je pense que c'est probablement aussi le problème dans votre cas puisque vous avez spécifié un type de retour sans rien spécifier à l'intérieur. Supprimez le type de retour si vous ne vous attendez à rien, ou si vous voulez récupérer du texte (par exemple si vous voulez que votre service remplace du texte dans un NSTextView). Je spécifierais le type de retour comme NSStringPboardType comme suit :

    <key>NSReturnTypes</key> 
        <array> 
          <string>NSStringPboardType</string> 
        </array> 

Il peut y avoir quelque chose de mal avec les types d'envoi, bien que je ne pense pas qu'il y en ait. Vous pouvez être sûr que si vous utilisez les étapes de débogage, j'ai suggéré qu'on vous dira pourquoi le service n'apparaît pas.