我正在开发OSX,Xcode8.2。Objective-C我使用脚本桥来访问InDesign。我有一个相当长的AppleScript,我想使用脚本桥将其转换为Objective-C,以利用其后台任务的可能性。
为了更好地理解,让我在之前展示一下applescript中的部分:
tell application "Adobe InDesign CC 2017"
tell active document
-- grep setup done before
find grep
end tell
end tellapplescript中的结果:
{
text from character 294 to character 298 of story id 1354 of document id 5 of application "Adobe InDesign CC 2017",
text from character 140 to character 144 of story id 1377 of document id 5 of application "Adobe InDesign CC 2017"
}如果我想在applescript中获取字符串,我会执行(注意"as string"):
text from character 294 to character 298 of story id 1354 of document id 5 of
application "Adobe InDesign CC 2017" as string
--> "Test1"objective-c中的翻译方法:
// document is an instance of the SBApplication indesign
[document findGrepReverseOrder:NO];结果为:
(
"<AdobeInDesignCC2017TextCtxt @0x608020a442f0: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':294, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':298, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1354 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>",
"<AdobeInDesignCC2017TextCtxt @0x608020a44140: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':140, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':144, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1377 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>"
)看起来每个AdobeInDesignCC2017TextCtxt对象都包含两个appleeventdescriptors来标记单词的位置和长度。我需要访问它们来提取信息。我检查了h.文件,但找不到像applescript中那样使用"as string“来提取文本的方法。如何访问描述符?任何想法都很感谢。
发布于 2017-04-04 18:13:15
我推荐使用AppleScript-ObjC桥,它允许您直接从ObjC调用AppleScript处理程序,就像您调用Cocoa方法一样。Scripting Bridge充斥着残缺的功能,而且很容易出现应用程序不兼容的问题,特别是像Adobe的老旧的碳基应用程序。它工作到一定程度,然后你就完了。(我认识一个人,他试图将他所有的Adobe脚本转换为SB,结果整个人突然停止了对一个小更新的工作。)
唯一有能力替代AppleScript的是py-appscript/SwiftAutomation (我使用py3-appscript实现高端插图自动化),但由于苹果的胡闹,我不再为那些人提供公共支持,所以你只能靠自己了。AppleScript是一种可怕的语言,但至少它得到了官方的支持,它的苹果活动桥梁是首屈一指的。Here's a quick how-to on calling AS from ObjC。只要在单个线程上调用AppleScript处理程序,程序的ObjC部分就可以利用线程、GCD等。它非常简单,几乎完全没有痛苦,并且允许每种语言做它最擅长的事情。
https://stackoverflow.com/questions/43202455
复制相似问题