2016-03-26 35 views
2

這是一個關於使用Cocoa腳本實現可編寫腳本的應用程序的問題。在我的可編寫腳本的應用程序中提供我自己的對象以「make new」

我的應用程序的腳本application對象包含自定義類的元素,我們稱它爲flower

在.sdef文件中,flower的Cocoa類被指定爲ScriptableFlower

在AppleScript的,一個可以寫信:

tell app "myapp" 
    get flowers 
end tell 

我的代碼提供了一個訪問函數用於檢索花:-(NSArray*)flowers

現在,我想實現的方式來添加新的花朵,這樣一方面可以寫:

tell app "myapp" 
    make new flower 
end tell 

它的默認行爲,使用NSCreateCommand默認核心套件處理程序「使」,是如下:

腳本引擎會通過調用我flowers函數取花的當前數組,然後實例ScriptableFlower類的新可可對象,然後調用setFlowers:(NSArray*)與包含我原來的對象的數組,再加上新創建的一個。

但是,這不適合我的應用程序:我不能允許腳本引擎隨意創建可編寫腳本的類的對象。

相反,我需要成爲一個實例化它們的人。

中途解決方案是實現默認的-(id)init方法,然後檢測它是否被我調用 - 如果沒有,我可以採取額外的步驟。但那並不乾淨。我寧願不讓腳本引擎創建新的對象,而是自己提供它們,因爲我可能已經準備好了「某處」的對象。

Cocoa Scripting中是否有一些條款導致它在我要創建新的腳本對象時調用我?

更新

爲了澄清:該Cocoa Scripting docs解釋說,一個可以實施特別處理插入(insertObject:in<Key>AtIndex:),使人們不必把整個NSArray的,但仍然導致腳本引擎創建物體。不過,我需要被要求創建對象。

回答

1

文件NSObjectScripting.h爲此提供了一個功能:

- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties; 

這是因爲OS X 10.5可用和記錄如下:

創建一個腳本類的新實例被插入到由關鍵字標識的關係,設置它的contentsValue和屬性,並返回它。否則返回失敗。 contentsValue和屬性來源於Make命令的「with contents」和「with properties」參數。 contentsValue可能爲零。當Cocoa調用此方法時,contentsValue和屬性都不會使用腳本鍵值編碼的-coerceValue:forKey:方法進行強制轉換。在.sdef聲明的腳本中,傳入的對象的類型可靠地匹配相關的.sdef聲明。

0

一個選項是子類NSCreateCommand並實現您自己的邏輯。

相關問題