【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2018-12-26
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多