2009-07-23 20 views
6

Tôi đang cố gắng thêm một số chức năng tập lệnh vào ứng dụng Cocoa mà tôi đã viết. Tôi đã tạo một sdef (Tệp Định nghĩa Tập lệnh) cho dự án của tôi. Cho đến nay tôi đã thành công trong việc tiếp cận đối tượng trẻ em (yếu tố) với AppleScript nhưng tôi không thể cho cuộc sống của tôi tìm ra cách gọi phương thức (lệnh).Xác định và thực thi các lệnh AppleScript đơn giản trong ứng dụng Cocoa

Đây là tệp sdef của tôi.

<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> 

Dưới đây là triển khai lớp điều khiển của tôi (đây là các đại biểu của ứng dụng của tôi)

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 

Cuối cùng, AppleScript tôi đang cố gắng là:

tell application "MyApplication" 
    testmethod 
end tell 

mà trả lời với "AppleScript Error - The variable testmethod is not defined."

Bất kỳ ý tưởng những gì tôi đang làm sai ở đây? Tôi cảm thấy như tôi đang thiếu một cái gì đó đơn giản nhưng Googling của tôi dường như không được bật lên bất cứ điều gì hữu ích.

+0

Có lẽ tôi đang thiếu thứ gì đó, nhưng đây có phải là ứng dụng Cocoa (OS X) hoặc ứng dụng Cocoa Touch (iPhone) không? Ứng dụng iPhone không hỗ trợ AppleScript. – sbooth

+0

Người hỏi đã làm rõ rằng UIController là tên (được chọn kém) của một bộ điều khiển ứng dụng tùy chỉnh/lớp đại biểu, vì vậy tôi đã cập nhật mã để loại bỏ nhầm lẫn. –

+1

Bạn đã tìm thấy giải pháp chưa? Tôi có cùng một vấn đề .. – Dmitry

Trả lời

1

(Tôi đã thực sự chưa bao giờ thêm dựng kịch bản để một ứng dụng Cocoa, vì vậy hãy đâm mình trong bóng tối với một hạt muối.)

Điều đầu tiên tôi sẽ đoán là exposedMethod: mất một tham số, nhưng tôi không thấy nơi có thể được chỉ định trong sdef hoặc AppleScript của bạn. Trong thực tế, có vẻ như AppleScript đang xử lý testmethod như một biến, không phải là một lệnh. (Có lẽ nó phải giống như "testmethod with ..." thay thế?) Bạn có thể cần phải xác định phần tử <parameter> hoặc <direct-parameter> cho lệnh trong sdef.

Ngoài ra, bạn sẽ không cần một đối tượng để gọi phương thức? Vì bộ điều khiển của bạn là đại biểu ứng dụng, tôi không chắc chắn về sự phức tạp ở đó, nhưng AppleScript có thể cố gắng gọi testMethod: trên NSApplication thay vì đại biểu của bạn không?

Tôi đoán bạn đã xem xét mẫu mã của Apple và các nguồn lực khác, nhưng nếu không, sau đây là một số liên kết có thể giúp:

Chúc bạn may mắn!

+1

Tham số phương thức đó là một thể hiện của NSScriptCommand, nó đóng gói bất kỳ tham số Sự kiện Apple nào có thể đã được truyền đi. Tất cả các phương thức lệnh script đều lấy một trong số đó làm đối số. –

2

Mọi thứ có vẻ đúng, nhưng mã cho <command/> phải là mã gồm hai phần (tám ký tự) và không phải là bốn.

2

tôi chỉ đăng một giải pháp chi tiết về làm thế nào để thêm một lệnh với lập luận đây: https://stackoverflow.com/a/10773994/388412

Nói tóm lại: Tôi nghĩ bạn nên phân lớp NSScriptCommand và ghi đè - (void) performDefaultImplementation hơn là phơi bày một phương pháp trong bộ điều khiển của bạn. Ít nhất đó là những gì tôi cất từ ​​docs: "Lệnh này là một lớp con của NSScriptCommand, chứa một phương pháp, performDefaultImplementation Đó là phương pháp ghi đè phiên bản trong NSScriptCommand"

... và nó hoạt động tốt cho tôi, xem câu trả lời được liên kết của tôi để biết chi tiết.

Các vấn đề liên quan