2015-03-20 5 views
2

Я пытаюсь создать меню в OS X Yosemite, которое просто состоит из выпадающего меню с подменю. Это меню и его подменю будут заполнены скриптом applescript.Создание простого меню меню с помощью Applescript

я нашел учебники на что-то подобное раньше, но все они, как представляется, достаточно устарели и не работают должным образом в Xcode 6.2, такие как этот:

MenuApp_ASOC

Я довольно опытный в Applescript, но у них не было много времени для кода в Objective C.

Где было бы подходящее место для поиска шаблона для того, что я хочу создать?

+1

Посмотрите на мой ответ здесь http://stackoverflow.com/a/29194549/261305 – markhunte

+0

@markhunte Спасибо! Это почти то, что я ищу. В приведенном примере количество элементов в раскрывающемся списке кажется статическим.
Я бы заполнил выпадающий список элементами, собранными из вывода обработанного скрипта. Как я могу это сделать? My current, non-menubar application заполняет свой список следующим образом (урезанный пример): 'repeat with theItem в пунктах myInstances с 1 по -1 ... copy {title: text item 2 ofNewItem} до конца библиотеки ... end repeat loadDataSource_ (library) ' Возможно ли использовать этот метод и в вашем коде? – yannikrock

+0

Извинения за плохое форматирование в последнем комментарии. – yannikrock

ответ

5

Это быстрый пример создания системы меню «на лету». Это то, что, как я думаю, вам нужно.

В этом примере при каждом нажатии кнопки меню Строка состояния пункты меню будут отличаться.

(требуется Yosemite)

Вставьте этот код в новый документ Script Editor AppleScript.

Сохранить это как оставаться открытым приложение, используя в качестве ... меню опцию Save.

Затем запустите приложение как обычное приложение.

use AppleScript version "2.4" 
use scripting additions 
use framework "Foundation" 
use framework "AppKit" 

property StatusItem : missing value 
property selectedMenu : "" -- each menu action will set this to a number, this will determin which IP is shown 

property theDisplay : "" 
property defaults : class "NSUserDefaults" 
property internalMenuItem : class "NSMenuItem" 
property externalMenuItem : class "NSMenuItem" 
property newMenu : class "NSMenu" 

property theList : "Jackson Aiden Liam Lucas Noah Mason Ethan Caden Jacob Logan Jayden Elijah Jack Luke Michael Benjamin Alexander " 
-- example list for the menu items that can be used. Ideally you will have your list created dynamically 


-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash 
if not (current application's NSThread's isMainThread()) as boolean then 
    display alert "This script must be run from the main thread." buttons {"Cancel"} as critical 
    error number -128 
end if 

on menuNeedsUpdate:(menu) 
    (* NSMenu's delegates method, when the menu is clicked this is called. 

    We use it here to call the method makeMenus(). Which removes the old menuItems and builds new ones. 

    This means the menu items can be changed dynamically. 

    *) 

    my makeMenus() 
end menuNeedsUpdate: 

on makeMenus() 

    newMenu's removeAllItems() -- remove existing menu items 

    -----< (* this is just to show in this example a dynamic list for the menu items 
    set someListInstances to {} 
    set counter to count of word of theList 
    repeat until (count of someListInstances) is (random number from 3 to counter) 

     set rnd to random number from 1 to counter 
     set thisItem to word rnd of theList 
     if thisItem is not in someListInstances then 
      copy thisItem to end of someListInstances 
     end if 
    end repeat 
    ---- < 

    repeat with i from 1 to number of items in someListInstances 
     set this_item to item i of someListInstances 
     set thisMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:this_item action:"someAction:" keyEquivalent:"") 

     (newMenu's addItem:thisMenuItem) 

     (thisMenuItem's setTarget:me) -- required for enabling the menu item 
     if i is equal to 3 then 
      (newMenu's addItem:(current application's NSMenuItem's separatorItem)) -- add a seperator 
     end if 
    end repeat 

end makeMenus 



--menuItems action is requied for the menu to be enabled 
on someAction:sender 
    --MenuItem --do some thing 
end someAction: 

-- create an NSStatusBar 
on makeStatusBar() 
    set bar to current application's NSStatusBar's systemStatusBar 

    set StatusItem to bar's statusItemWithLength:-1.0 

    -- set up the initial NSStatusBars title 
    StatusItem's setTitle:"IP" 
    -- set up the initial NSMenu of the statusbar 
    set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom" 

    newMenu's setDelegate:me (* 
    Requied delegation for when the Status bar Menu is clicked the menu will use the delegates method (menuNeedsUpdate:(menu)) to run dynamically update. 


    *) 

    StatusItem's setMenu:newMenu 

end makeStatusBar 


my makeStatusBar() 
+0

Это великолепно, спасибо! Не могли бы вы получить учебник по добавлению подменю? @markhunte – yannikrock

+0

@yannikrock Не вручать. Но вы можете прочитать документацию https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMenuItem_Class/index.html и https://developer.apple.com/library/mac/ документация/Cocoa/Reference/ApplicationKit/Classes/NSMenu_Class/index.html – markhunte

+0

любое предложение о том, как показать изображение в меню? что-то вроде нажатия на меню, и вам будет показано изображение ... [https://developer.apple.com/documentation/appkit/nsmenuitem/1514819-image](https://developer.apple.com/documentation/appkit/ nsmenuitem/1514819-image) кажется вызывающим воспоминания, но может быть для какого-то другого использования ... –

0

Я призываю вас посетить форум ASOC по адресу http://macscripters.net, там есть люди, которые могут ответить на ваши вопросы, как заставить его работать с XCode 6.2. Но вы должны приложить усилия по документированию ваших проблем/ошибок, которые вы получаете, конечно, просто «не работает» недостаточно, чтобы решить ваши проблемы.

И это то, что вам все равно придется делать, если вы не так счастливы, что найдете приложение меню, которое работает для проекта XCode.

Внутри macscripters, http://macscripter.net/viewtopic.php?id=38891&p=1 есть гораздо меньший проект приложения меню, созданный DJ Bazzie Wazzie, что может быть намного проще сделать работу. Вы можете решить любые проблемы в этом потоке или на форуме ASOC.

Шейн Стэнли, автор двух хороших книг АСОК, и редактор АСОК часто посещает там фору и очень полезный и добрый парень!