2009-07-23 7 views
6

Sto tentando di aggiungere alcune funzionalità di script a un'app Cocoa che ho scritto. Ho creato un sdef (File di definizione dello script) per il mio progetto. Finora ho avuto successo ad accedere agli oggetti child (elementi) con AppleScript ma non riesco a capire come chiamare metodi (comandi).Definizione ed esecuzione di semplici comandi AppleScript in un'app Cocoa

Ecco il mio file sdef.

<suite name="mySuite" code="mSUI" description="My Application Suite"> 
    <class name="application" code="capp" description="Top level scripting object."> 
     <cocoa class="NSApplication"/> 
     <!-- I can access these elements fine --> 
     <element description="Test children." type="child" access="r"> 
      <cocoa key="myChildren"/> 
     </element> 
     <!-- Cannot seem to call this method :(--> 
     <responds-to command="testmethod"> 
      <cocoa method="exposedMethod:"/> 
     </responds-to> 
    </class> 
    <class name="child" code="cHIL" description="A Child." plural="children"> 
     <cocoa class="Child"/> 
     <property name="name" code="pnam" description="The child name." type="text" access="r"> 
      <cocoa key="name"/> 
     </property> 
    </class> 
    <command name="testmethod" code="tEST" description="Execute the test method" /> 
</suite> 

Qui sono i miei implementazioni di classe controller (questo è il delegato della mia applicazione)

MyController.h

#import <Cocoa/Cocoa.h> 

@interface MyController : NSObject { 
    NSMutableArray* myChildren; 
} 
// Some Methods 

@end 

MyController + Scripting.m

#import "MyController+Scripting.h" 

@implementation MyController (Scripting) 

// This works when I'm accessing the myChildren 
- (BOOL)application:(NSApplication*)sender delegateHandlesKey:(NSString*)key { 
    NSLog(@"Key = %@", key); 
    return ([key isEqualToString:@"myChildren"]); 
} 
// This does NOT work... 
- (void)exposedMethod:(NSScriptCommand*)command { 
    NSLog(@"Invoked Test Script Method %@", [command description]); 
} 

@end 

Infine, l'AppleScript che sto cercando è:

tell application "MyApplication" 
    testmethod 
end tell 

che risponde con "AppleScript Error - The variable testmethod is not defined."

Tutte le idee che cosa sto facendo male qui? Mi sento come se mi mancasse qualcosa di semplice ma il mio googling sembra non rivelarsi utile.

+0

Forse mi manca qualcosa, ma si tratta di un'app Cocoa (OS X) o di un'app Cocoa Touch (iPhone)? Le app per iPhone non supportano AppleScript. – sbooth

+0

Il richiedente ha chiarito che UIController era il nome (scarsamente scelto) di una classe di controller/delegato dell'applicazione personalizzata, quindi ho aggiornato il codice per rimuovere la confusione. –

+1

Hai trovato una soluzione? Ho lo stesso problema .. – Dmitry

risposta

1

(in realtà ho mai aggiunto scriptability ad un'applicazione Cocoa, in modo da prendere il mio salto nel buio con un grano di sale.)

La prima cosa che direi è che exposedMethod: prende un parametro, ma io non vedere dove si potrebbe essere specificato nel tuo sdef o AppleScript. Infatti, sembra che AppleScript stia trattando lo testmethod come una variabile, non un comando. (Forse dovrebbe essere qualcosa come "testmethod with ..." invece?) Potrebbe essere necessario definire un elemento <parameter> o <direct-parameter> per il comando in sdef.

Inoltre, non sarebbe necessario un oggetto su cui chiamare il metodo? Poiché il controller è il delegato dell'applicazione, non sono sicuro delle complessità, ma AppleScript potrebbe provare a richiamare testMethod: in NSApplicazione anziché come delegato?

sto cercando di indovinare che hai guardato il codice di esempio di Apple e altre risorse, ma se non, ecco alcuni link che possono aiutare:

Buona fortuna!

+1

Il parametro su quel metodo è un'istanza di NSScriptCommand, che incapsula tutti i parametri Apple Event che potrebbero essere stati passati. Tutti i metodi di comando script accettano uno di questi come argomento. –

2

Le cose sembrano quasi corrette, ma il codice per il <command/> dovrebbe essere un codice in due parti (otto caratteri) e non quattro.

2

Ho appena pubblicato una soluzione dettagliata su come aggiungere un comando con l'argomento qui: https://stackoverflow.com/a/10773994/388412

In breve: penso che si dovrebbe creare una sottoclasse NSScriptCommand e sovrascrivere - (void) performDefaultImplementation anziché esporre un metodo nel tuo controller. Almeno questo è quello che ho distillato dalla docs: "Questo comando è una sottoclasse di NSScriptCommand, contenente un metodo, performDefaultImplementation Tale metodo sostituisce la versione in NSScriptCommand"

... e funziona benissimo per me, vedi la mia risposta collegata per i dettagli.

Problemi correlati