目錄
-
入門
-
高級
Sketch插件可以通過Mocha和CocoaScript實(shí)現(xiàn),它允許您使用JavaScript編寫的外部腳本使用Objective-C / Cocoa代碼。該橋負(fù)責(zé)JavaScript和Cocoa之間的翻譯,因此您可以專注于重要的部分(即使Sketch成為可怕的東西)。
來自CocoaScript的自述文件:
CocoaScript建立在Apple的JavaScriptCore之上,這是與Safari相同的JavaScript引擎。所以帮碰,當(dāng)你在CocoaScript中編寫代碼時(shí),你確實(shí)在編寫JavaScript拾积。
CocoaScript還包含一個(gè)橋梁殉挽,可讓您通過JavaScript訪問Apple的Cocoa框架。這意味著除了標(biāo)準(zhǔn)JavaScript庫之外拓巧,您還可以使用許多精彩的類和函數(shù)斯碌。
JavaScript環(huán)境
您的插件腳本不會在瀏覽器中運(yùn)行,但會在JavaScriptCore上下文中運(yùn)行玲销。因此它運(yùn)行的JavaScript環(huán)境有點(diǎn)不常見输拇。
- 在JavaScript的標(biāo)準(zhǔn)庫可用。
- 其他的都不是贤斜。這意味著
setTimeout
策吠,fetch
,console
等都是不可用瘩绒。 - NodeJS核心模塊不可用猴抹。
話雖這么說,如果你使用skpm
锁荔,它會自動填充工具有些事情你:console
蟀给,setTimeout
,setInterval
和fetch
。
訪問Cocoa和Sketch API
您可以從CocoaScript訪問所有Cocoa和Sketch API跋理。
Objective-C屬性的行為與在橋的JavaScript端應(yīng)該一樣择克。
Objective-C方法作為對象的不透明JavaScript代理的屬性公開。
將選擇器名稱轉(zhuǎn)換為JavaScript屬性名稱時(shí)采取以下步驟:
- 所有冒號都轉(zhuǎn)換為下劃線(最新的下劃線是可選的)前普。
- 選擇器的每個(gè)組件都連接成一個(gè)沒有分隔的字符串肚邢。
這樣,一個(gè)選擇器如executeOperation:withObject:error:
轉(zhuǎn)換為函數(shù)名稱executeOperation_withObject_error()
拭卿。
例如骡湖,如果你想打開一個(gè)File Picker面板,你可以使用NSOpenPanel類:
var openPanel = NSOpenPanel.openPanel()
openPanel.setCanChooseDirectories(false)
openPanel.setCanChooseFiles(true)
openPanel.setCanCreateDirectories(false)
openPanel.setDirectoryURL(NSURL.fileURLWithPath('~/Documents/'))
openPanel.setTitle('Choose a file')
openPanel.setPrompt('Choose')
openPanel.runModal()
如果您需要更多關(guān)于Cocoa的信息峻厚,請查看參考資料部分响蕴。
一些特定的全局變量
指針
對于某些Obj-C選擇器,您可能需要傳遞一個(gè)指針惠桃。這在JavaScript中不存在浦夷,所以有一種全局方法來創(chuàng)建一個(gè):
var ptr = MOPointer.alloc().init()
var ptrToSomething = MOPointer.alloc().initWithValue(something)
長時(shí)間運(yùn)行腳本
如果您的腳本正在進(jìn)行異步操作,我們需要告訴Sketch保留它并且不要垃圾收集它刽射。
你可以通過訪問COScript
:
COScript.currentCOScript().shouldKeepAround = true
腳本完成其工作后军拟,不要忘記釋放它:
COScript.currentCOScript().shouldKeepAround = false
下一步
有關(guān)這座橋如何運(yùn)作的更多信息,請查看Mocha README誓禁,它確實(shí)是完整的(但需要一些Obj-C的概念)。