2009-07-23 22 views
6

Próbuję dodać niektóre funkcje skryptowe do aplikacji Cocoa, którą napisałem. Stworzyłem dla mojego projektu sdef (Plik definicji skryptu). Do tej pory udało mi się uzyskać dostęp do dzieci obiektów (elementów) za pomocą AppleScript, ale nie mogę na całe życie dowiedzieć się, jak wywoływać metody (polecenia).Definiowanie i wykonywanie prostych poleceń AppleScript w aplikacji Cocoa

Oto mój plik 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> 

Oto moje implementacje klasy kontroler (to jest delegatem mojego wniosku)

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 

Wreszcie AppleScript próbuję to:

tell application "MyApplication" 
    testmethod 
end tell 

który odpowiada "AppleScript Error - The variable testmethod is not defined."

pomysłów, co robię źle tutaj? Czuję, że brakuje mi czegoś prostego, ale mój Googling nie wydaje się być pomocny.

+0

Być może brakuje mi czegoś, ale czy jest to aplikacja Cocoa (OS X) lub aplikacja Cocoa Touch (iPhone)? Aplikacje na iPhone'a nie obsługują AppleScript. – sbooth

+0

Pytający wyjaśnił, że UIController był (źle wybraną) nazwą niestandardowej kontrolera aplikacji/klasy delegata, więc zaktualizowałem kod, aby usunąć zamieszanie. –

+1

Czy znalazłeś rozwiązanie? Mam ten sam problem .. – Dmitry

Odpowiedz

1

(ja faktycznie nigdy dodany scriptability do aplikacji Cocoa, więc weź moje ukłucie w ciemności z przymrużeniem oka).

Pierwszą rzeczą Przypuszczam, że exposedMethod: przyjmuje parametr, ale nie widzisz, gdzie można by określić w twoim sdef lub AppleScript. W rzeczywistości wygląda na to, że AppleScript traktuje testmethod jako zmienną, a nie polecenie. (Może powinno być coś takiego jak "testmethod with ..." zamiast tego?) Może być konieczne zdefiniowanie elementu <parameter> lub <direct-parameter> dla polecenia w sdef.

Również, czy nie potrzebujesz obiektu do wywołania metody? Ponieważ twój kontroler jest delegatem aplikacji, nie jestem pewien zawiłości tam, ale może AppleScript próbuje wywołać testMethod: na NSApplication zamiast swojego delegata?

Zgaduję masz spojrzał na przykładowy kod Apple'a i innych zasobów, ale jeśli nie, oto kilka linków, które mogą pomóc:

Powodzenia!

+1

Parametr ta metoda jest instancją NSScriptCommand, która zawiera wszystkie parametry zdarzeń Apple, które mogły zostać przekazane. Wszystkie metody komend skryptowych przyjmują jeden z nich jako argument. –

2

Rzeczy wyglądają w większości poprawnie, ale kod dla <command/> powinien być dwuczęściowym kodem (osiem znaków), a nie czterema.

2

Właśnie napisali szczegółowe rozwiązania, w jaki sposób dodać polecenie z argumentem tutaj: https://stackoverflow.com/a/10773994/388412

W skrócie: myślę, że należy podklasy NSScriptCommand i zastąpić - (void) performDefaultImplementation zamiast wystawiania metoda w twoim kontrolerze. Przynajmniej to, co ja destylowany z docs: „To polecenie jest podklasą NSScriptCommand, zawierający jedną metodę, performDefaultImplementation Metoda ta zastępuje wersję w NSScriptCommand”

... i to działa dobrze dla mnie zobacz moją połączoną odpowiedź, aby uzyskać szczegółowe informacje.

Powiązane problemy