在 AppleScript 中从 Objective-c 调用方法或函数
Call a method or function from Objective-c in AppleScript
我正在尝试使用 LestMove 来更精确
第二种实现方法,它说:
选项 2:
将以下文件复制到您的项目中:
PFMoveApplication.h
PFMoveApplication.m
如果您的项目启用了 ARC,您需要在上述文件上禁用 ARC。您可以通过将 -fno-objc-arc 编译器标志添加到 PFMoveApplication.m 源文件来实现。参见 How can I disable ARC for a single file in a project?
如果您的应用程序已本地化,也请将 'MoveApplication.string' 文件复制到您的项目中。
Link 您针对 Security.framework 的申请。
在您的应用委托的“-[applicationWillFinishLaunching:]”方法中,调用最顶部的 PFMoveToApplicationsFolderIfNecessary 函数。
但我无法调用方法 / Class,有人可以帮我解决这个问题吗?提前致谢!
一般来说,有几种方法可以在您的 AppleScriptObjC 项目中设置 Objective-C class:
- 将文件添加到项目中 - Objective-C class 名称将是
@interface
/@implementation
声明中使用的
在您正在使用的 AppleScript class/script 中添加一个插座 属性,例如property someProperty : missing value
以编程方式实例化 class:
set someProperty to current application's ClassName's alloc's init()
或
- 使用 Interface Builder 连接东西:
- 将库中的 NSObject(蓝色立方体)添加到您的项目
- 将 object/cube 的 class 设置为 Identity Inspector[=91] 中 Objective-C 文件的 class 名称=]
- 将 AppDelegate IB Outlet 连接到 Connections Inspector
中的 object/cube
设置出口 属性 后,Objective-C 方法可以像任何其他方法一样使用 script/class:
someProperty's handler()
那个 LetsMove 项目并不是真正为 AppleScriptObjC 设置的,但我可以稍微调整一下以获得它 运行。我不太擅长 编写 Objective-C,但以下内容对我有用,在 Mojave 中使用 Xcode 10 的新默认 AppleScript 项目(原始文件是超过 500 行,所以我只是突出显示更改):
- 将
PFMoveApplication.h
和 PFMoveApplication.m
文件添加到项目中(class 名称为 LetsMove
)
- 在构建阶段
中将Security.framework
添加到Link带库的二进制文件
- 如原始项目 README 中所述,将编译器标志
-fno-objc-arc
添加到 的 Compile Sources 中的 Objective-C 文件中构建阶段
-- 现在稍微修改 Objective-C 文件:
- 将
@interface
声明移至 .h
文件并在其中包含以下重新定义的方法签名:
PFMoveToApplicationsFolderIfNecessary
和PFMoveIsInProgress
方法被重新定义为实例方法:
- (void)PFMoveToApplicationsFolderIfNecessary;
- (BOOL)PFMoveIsInProgress;
- 在
.m
文件中重新定义上述方法签名,并将这些方法包含在 @implementation
部分 - 为此,将 @end
移动到辅助方法之前(在 PFMoveIsInProgress
方法之后)
- 删除
PFMoveToApplicationsFolderIfNecessary
方法开头的isMainThread
语句-这不是不需要的(AppleScript通常在主线程上运行),并修复了另一个问题
- 其中仍然有一些来自原始应用程序的东西,例如 NSUserDefaults,所以对于您自己的项目,看看是否还有其他需要更改的内容(对话框文本等)
最后,在 AppDelegate.applescipt
文件中,将以下内容添加到 applicationWillFinishLaunching:
current application's LetsMove's alloc's init()'s PFMoveToApplicationsFolderIfNecessary()
我正在尝试使用 LestMove 来更精确 第二种实现方法,它说:
选项 2:
将以下文件复制到您的项目中:
PFMoveApplication.h PFMoveApplication.m 如果您的项目启用了 ARC,您需要在上述文件上禁用 ARC。您可以通过将 -fno-objc-arc 编译器标志添加到 PFMoveApplication.m 源文件来实现。参见 How can I disable ARC for a single file in a project?
如果您的应用程序已本地化,也请将 'MoveApplication.string' 文件复制到您的项目中。
Link 您针对 Security.framework 的申请。
在您的应用委托的“-[applicationWillFinishLaunching:]”方法中,调用最顶部的 PFMoveToApplicationsFolderIfNecessary 函数。
但我无法调用方法 / Class,有人可以帮我解决这个问题吗?提前致谢!
一般来说,有几种方法可以在您的 AppleScriptObjC 项目中设置 Objective-C class:
- 将文件添加到项目中 - Objective-C class 名称将是
@interface
/@implementation
声明中使用的 在您正在使用的 AppleScript class/script 中添加一个插座 属性,例如
property someProperty : missing value
以编程方式实例化 class:
set someProperty to current application's ClassName's alloc's init()
或
- 使用 Interface Builder 连接东西:
- 将库中的 NSObject(蓝色立方体)添加到您的项目
- 将 object/cube 的 class 设置为 Identity Inspector[=91] 中 Objective-C 文件的 class 名称=]
- 将 AppDelegate IB Outlet 连接到 Connections Inspector 中的 object/cube
设置出口 属性 后,Objective-C 方法可以像任何其他方法一样使用 script/class:
someProperty's handler()
那个 LetsMove 项目并不是真正为 AppleScriptObjC 设置的,但我可以稍微调整一下以获得它 运行。我不太擅长 编写 Objective-C,但以下内容对我有用,在 Mojave 中使用 Xcode 10 的新默认 AppleScript 项目(原始文件是超过 500 行,所以我只是突出显示更改):
- 将
PFMoveApplication.h
和PFMoveApplication.m
文件添加到项目中(class 名称为LetsMove
) - 在构建阶段 中将
- 如原始项目 README 中所述,将编译器标志
-fno-objc-arc
添加到 的 Compile Sources 中的 Objective-C 文件中构建阶段
Security.framework
添加到Link带库的二进制文件
-- 现在稍微修改 Objective-C 文件:
- 将
@interface
声明移至.h
文件并在其中包含以下重新定义的方法签名: PFMoveToApplicationsFolderIfNecessary
和PFMoveIsInProgress
方法被重新定义为实例方法:- (void)PFMoveToApplicationsFolderIfNecessary; - (BOOL)PFMoveIsInProgress;
- 在
.m
文件中重新定义上述方法签名,并将这些方法包含在@implementation
部分 - 为此,将@end
移动到辅助方法之前(在PFMoveIsInProgress
方法之后) - 删除
PFMoveToApplicationsFolderIfNecessary
方法开头的isMainThread
语句-这不是不需要的(AppleScript通常在主线程上运行),并修复了另一个问题 - 其中仍然有一些来自原始应用程序的东西,例如 NSUserDefaults,所以对于您自己的项目,看看是否还有其他需要更改的内容(对话框文本等)
最后,在 AppDelegate.applescipt
文件中,将以下内容添加到 applicationWillFinishLaunching:
current application's LetsMove's alloc's init()'s PFMoveToApplicationsFolderIfNecessary()