2009-07-23 39 views
6

我正在嘗試向我編寫的Cocoa應用程序添加一些腳本功能。我爲我的項目創建了一個sdef(腳本定義文件)。到目前爲止,我已經成功地使用AppleScript訪問對象子元素(元素),但是我不能在我的生活中弄清楚如何調用方法(命令)。在Cocoa應用程序中定義和執行簡單的AppleScript命令

這是我的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> 

這裏是我的控制器類的實現(這是我的申請的代表)

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 

最後,我想的是的AppleScript:

tell application "MyApplication" 
    testmethod 
end tell 

"AppleScript Error - The variable testmethod is not defined."

任何想法,迴應我在做什麼錯在這裏?我覺得我錯過了一些簡單的東西,但是我的谷歌搜索似乎沒有提供任何有用的東西。

+0

也許我錯過了一些東西,但這是一個可可(OS X)的應用程序或可可觸摸(iPhone)的應用程序? iPhone應用程序不支持AppleScript。 – sbooth 2009-07-24 01:34:08

+0

提問者澄清說,UIController是自定義應用程序控制器/委託類的(選擇不當)名稱,所以我更新了代碼以消除混淆。 – 2009-07-29 16:21:35

回答

1

(我實際上從未被添加腳本能力的Cocoa程序,所以要我在黑暗中刺用一粒鹽。)

我猜想的第一件事是,exposedMethod:需要一個參數,但我沒有看到你的sdef或AppleScript中可能指定了哪一個。事實上,它看起來像AppleScript將testmethod作爲一個變量,而不是一個命令。 (也許它應該是類似「testmethod with ...」的東西?)您可能需要爲sdef中的命令定義一個<parameter><direct-parameter>元素。

另外,你不需要一個對象來調用該方法嗎?由於你的控制器是應用程序委託,我不確定那裏有錯綜複雜的情況,但AppleScript可能試圖在NSApplication上調用testMethod:而不是委託?

我猜你已經看過蘋果的示例代碼和其他資源,但如果沒有,這裏有一些鏈接,可以幫助:

祝你好運!

2

事情看起來大多是正確的,但<command/>的代碼應該是一個由兩部分組成的代碼(八個字符),而不是四個。

2

我剛剛張貼在如何添加一個帶有參數這裏命令一個詳細的解決方案:https://stackoverflow.com/a/10773994/388412

總之:我覺得你應該繼承NSScriptCommand並覆蓋- (無效)performDefaultImplementation而不是暴露您的控制器中的一種方法。至少這是我從docs蒸餾:「這個命令是NSScriptCommand的一個子類,包含一個方法,performDefaultImplementation這方法重寫版本NSScriptCommand」

...它工作正常對我來說,請參閱我的鏈接答案的細節。

相關問題