【问题标题】:Enable menu items and call function when activated in AppleScript在 AppleScript 中激活时启用菜单项和调用功能
【发布时间】:2020-08-10 03:25:41
【问题描述】:
我正在尝试启用我拥有的 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
【问题讨论】:
标签:
applescript
nsmenu
nsmenuitem
【解决方案1】:
主要问题是在创建菜单项时您的操作处理程序声明与选择器不匹配,您需要指定包含操作方法的目标。
系统通常将发送者(菜单项)传递给操作,因此需要使用单个参数声明它们,选择器以冒号结尾 - 例如:
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