Objective c 脚本桥和com.apple.iWork.Pages——这能工作吗?

Objective c 脚本桥和com.apple.iWork.Pages——这能工作吗?,objective-c,cocoa,applescript,Objective C,Cocoa,Applescript,我试图使用脚本桥计算文档页面中的单词(文档格式为RTF)。(我可以使用NSApplescript完成,但我不希望代码中包含所有支持applescript的管道胶带) 当我使用applescript(和NSAppleScript API)执行此任务时,我可以非常简单(并且成功)地完成此任务: 但是,当我尝试使用脚本桥的等效方法时,我的所有对象似乎都有空内容。我的代码如下: + (NSUInteger) wordCountForApp: (SBApplication*) sbApp docNamed

我试图使用脚本桥计算文档页面中的单词(文档格式为RTF)。(我可以使用NSApplescript完成,但我不希望代码中包含所有支持applescript的管道胶带) 当我使用applescript(和NSAppleScript API)执行此任务时,我可以非常简单(并且成功)地完成此任务:

但是,当我尝试使用脚本桥的等效方法时,我的所有对象似乎都有空内容。我的代码如下:

+ (NSUInteger) wordCountForApp: (SBApplication*) sbApp docNamed: (NSString*) docName
{
    PagesApplication *pages = (PagesApplication*)sbApp; 
    PagesDocument *doc = [[pages documents] objectWithName:docName];
    PagesText *text = [doc bodyText];
    SBElementArray *words = [text words];
    NSUInteger wc = [words count];
    NSLog(@"Pages word count = %ul", (unsigned int) wc);
    return wc; // wc comes back as zero always ... grrrr
}   
我已经验证了我是在主线程上运行这些东西的(并且等价的代码对TextEdit有效)。对正在发生的事情/如何解决有什么想法吗


感谢您阅读到目前为止……

该代码适合我。F脚本中的等效项:

> pages := SBApplication applicationWithBundleIdentifier: 'com.apple.iWork.Pages'

> (pages documents objectWithName: 'fun') bodyText words count
303
我建议您使用调试器逐步完成它,并确保每个对象都是您期望的对象,即
页面
[页面文档]
,等等

如果您编写此代码是为了外部使用,理想情况下不应按名称引用文档;用户可以打开多个同名文档

另一个选项是,它提供了一个整洁的ASTranslate实用程序,可以将AppleScript转换为Objective-C(对于其他appscript绑定,可以使用Ruby或Python)。例如,对于上面的内容,您可以使用以下内容:

#import "PGGlue/PGGlue.h"
PGApplication *pages = [PGApplication applicationWithName: @"Pages"];
PGReference *ref = [[pages documents] byName: @"fun"];
PGCountCommand *cmd = [[ref count] each: [PGConstant word]];
id result = [cmd send];

所以问题是,我要的是一个名为“something.rtf”的文档,我刚刚在页面中打开了它。但当页面打开“something.rtf”时,它会将其命名为“something”。然后,当您请求名为“something.rtf”的文档时,它不会返回nil,因为该文档不存在该名称。相反,它返回一个名为“something.rtf”的PagesDocument,它没有有效的内容:一个NIL文档。我想我只是太蠢了,当我屈服于这样的想法时,我没有意识到这一点


后来我检查了其他应用程序,这似乎是正常的applescript行为,当您按名称请求文档(以获取包含零文档的“有效对象”)时。哦,好吧。

肯定发生了一些奇怪的事情——它只是桥接代码失败,并且只在页面上失败(我知道)。我可能不得不打包一个演示,然后在另一台mac电脑上试用,看看我的电脑是不是“着魔了”。我已经通过了调试器,对象返回了,但不知何故,它们在内部是空的(无论如何根据[NSObject description])。关于文档命名问题,在本代码的上下文中它不会是一个问题。无论如何,尽管如此,我还是不知道你提到的任何一个工具,谢谢你。去调查…所以问题是我要的是一个名为“something.rtf”的文档。页面打开“something.rtf”,但将其命名为“something”。然后,当您请求名为“something.rtf”的文档时,它不会返回nil,因为该文档不存在该名称。相反,它返回一个名为“something.rtf”的PagesDocument,它没有有效的内容:一个NIL文档。我想我只是太蠢了,当我屈服于这样的想法时,我没有意识到这一点。后来我检查了其他应用程序,这似乎是正常的applescript行为,当你按名称要求文档时(得到一个零文档)。哦,是的,文档的显示名称(可以去掉扩展名,甚至是本地化名称)和磁盘上的名称之间有区别。您可能希望改为按路径匹配。
#import "PGGlue/PGGlue.h"
PGApplication *pages = [PGApplication applicationWithName: @"Pages"];
PGReference *ref = [[pages documents] byName: @"fun"];
PGCountCommand *cmd = [[ref count] each: [PGConstant word]];
id result = [cmd send];