在 AppleScript 中激活时启用菜单项和调用函数

Enable menu items and call function when activated in AppleScript

我正在尝试启用我拥有的 NSMenuItems,但它似乎不起作用。我不确定我做错了什么,而且我对 AppleScript 还很陌生。单击菜单项时,它们需要调用代码中所示的函数。

use scripting additions
use framework "Foundation"
use framework "AppKit"

set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0

StatusItem's setTitle:"menu"
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
set menuItem1 to current application's NSMenuItem's alloc()'s initWithTitle:"item 1" action:"action1:" keyEquivalent:""
set menuItem2 to current application's NSMenuItem's alloc()'s initWithTitle:"item 2" action:"action2:" keyEquivalent:""

StatusItem's setMenu:newMenu
newMenu's addItem:menuItem1
newMenu's addItem:(current application's NSMenuItem's separatorItem())
newMenu's addItem:menuItem2

on action1()
    log "this works"
end action1

on action2()
    log "this works 2"
end action2

主要问题是您的操作处理程序声明在创建菜单项时与选择器不匹配,您需要指定包含操作方法的目标。

系统通常会将发送者(菜单项)传递给操作,因此需要使用单个参数声明它们,选择器以冒号结尾 - 例如:

on action1:sender --> matches the selector "action1:"

如果您不向自己的方法传递任何内容,它们将没有参数或结尾冒号:

on anotherAction() --> matches the selector "anotherAction"

以下脚本匹配方法声明并设置目标 - 请注意,当从脚本编辑器 运行 时,脚本通常会在使用任何菜单项之前结束,因此当调用了操作方法 - 我改用了警报。我还添加了一个终止处理程序(没有参数)来删除状态菜单,这样当从脚本编辑器进行测试时,您不会得到一个充满它们的菜单栏(理论上):

use framework "Foundation"
use scripting additions

property statusItem : missing value

on run -- example
   set my statusItem to current application's NSStatusBar's systemStatusBar's statusItemWithLength:(current application's NSVariableStatusItemLength)
   statusItem's setTitle:"menu"
   set newMenu to current application's NSMenu's alloc()'s initWithTitle:""
   (newMenu's addItemWithTitle:"item 1" action:"action1:" keyEquivalent:"")'s setTarget:me
   (newMenu's addItemWithTitle:"item 2" action:"action2:" keyEquivalent:"")'s setTarget:me
   newMenu's addItem:(current application's NSMenuItem's separatorItem)
   (newMenu's addItemWithTitle:"Quit" action:"terminate" keyEquivalent:"")'s setTarget:me
   statusItem's setMenu:newMenu
end run

on action1:sender
   display alert "Menu " & quoted form of (sender's title() as text) & " works"
end action1:

on action2:sender
   display alert "Menu " & quoted form of (sender's title() as text) & " also works"
end action2:

to terminate() -- quit handler is not called from normal NSApplication terminate:
   current application's NSStatusBar's systemStatusBar's removeStatusItem:statusItem
   if name of current application does not start with "Script" then tell me to quit
end terminate