NSAppleEventDescriptor从Scripting bridge解包问题返回

时间:2017-04-04 08:51:35

标签: objective-c macos applescript scripting-bridge nsappleeventdescriptor

我正在研究OSX,Xcode 8.2。 Objective-C的。 我使用脚本桥来添加Adobe InDesign。我有一个很长的AppleScript,我想用Scripting-Bridge转换为Objective-C,以利用它的后台任务可能性。

为了更好地理解,让我告诉你之前的AppleScript部分:

tell application "Adobe InDesign CC 2017"
    tell active document
       -- grep setup done before
       find grep
    end tell
end tell

结果是AppleScript:

{
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中获取字符串(注意"作为字符串"):

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。文件,但无法找到提取文本的方法,如使用&#34;作为字符串&#34;在applescript中。我如何访问描述符?任何想法都赞赏。

1 个答案:

答案 0 :(得分:1)

我建议使用AppleScript-ObjC桥接器,它允许您直接从ObjC调用AppleScript处理程序,就像调用Cocoa方法一样。 Scripting Bridge充斥着残缺和缺失的功能,并且非常容易出现与应用程序不兼容的问题,特别是对于像Adobe这样的旧碳基应用程序。它起作用了一点,然后你就搞砸了。 (我知道有一个人尝试将他所有的Adobe脚本转换为SB,只是为了突然停止处理一个小的更新。)

AppleScript唯一能胜任的替代品是py-appscript / SwiftAutomation(我使用py3-appscript进行高端插图自动化),但由于Apple的搞砸,我不再为那些人提供公众支持,所以你会在你自己。 AppleScript是一种可怕的语言,但至少它是官方支持的[咳嗽],它的Apple事件桥是首屈一指的。 Here's a quick how-to on calling AS from ObjC。只要你在一个线程上调用你的AppleScript处理程序,你的程序的ObjC部分就可以利用线程,GCD等。它非常简单,几乎完全无痛,并且允许每种语言都做它最擅长的。