2015-02-28 4 views
2

Я не использовал раскадровку и xib, просто использовал только код. Я хочу добавить меню «Изменить» программно. Мои вопросы:Как добавить NSMenu Programmatically?

1) Как показать меню «Изменить»/Какие коды необходимо ввести в комментарий Вопрос 1)?

2) Есть любые меры, например, скопированные & пасты?

class TestManager: NSObject { 

// .... 
    override init() { 
     let editMenuItems = [ 
      NSMenuItem(title: "Cut", action: nil(/* Question 2) */), keyEquivalent: ""), 
      NSMenuItem(title: "Copy", action: nil, keyEquivalent: ""), 
      NSMenuItem(title: "Paste", action: nil, keyEquivalent: ""), 
     ] 

     for editMenuItem in editMenuItems { 
      self.editMenu.addItem(editMenuItem) 
     } 

     // Qustion 1) .. show "Edit" Menu 
    } 
} 
+0

Не могли бы вы указать, почему вы хотите сделать приложение с mainmenu, если оно вам действительно нужно? –

+1

Причина, по которой я использую собственный код: 1) То, что я хочу сделать, похоже на https://github.com/devxoul/allkdic (Пользовательский код) 2) Если вы знаете, как закодировать пользовательский интерфейс, то вы знать, что происходит под капотом, в то время как то же самое не обязательно относится к NIB и раскопкам. – Astin

+0

Это, честно говоря, не имеет никакого смысла. Если вам нужно меню (и вы заявляете, что оно вам нужно), используйте MainMenu как находящийся в Info.plist. –

ответ

4

Вы не показываете, где self.editMenu.

В любом случае вам необходимо получить mainMenu из экземпляра NSApplication и добавить пункт меню к тому, что имеет меню в качестве подменю. Итак, что-то вроде:

var editMenuItem = NSMenuItem() 
editMenuItem.title = "Edit" 
var mainMenu = NSMenu() 
mainMenu.addItem(editMenuItem) 
mainMenu.setSubmenu(self.editMenu, forItem:editMenuItem) 
NSApplication.sharedApplication().mainMenu = mainMenu 

Я не работаю в Swift, поэтому возможны некоторые ошибки.

Что касается того, какой селектор действий использовать для пунктов меню «Редактировать», самое легкое для вас - создать главное меню NIB только для его изучения. Посмотрите на селектора действий, используемые для пунктов меню готового меню «Правка». Вы обнаружите, что элемент «Копировать» использует селектор copy:, например. Это может быть представлено в Swift как строка, "copy:".

+0

Спасибо за ответ. У меня недостаточно репутации. Я постараюсь сделать это и снова прокомментировать. Спасибо, Кен. – Astin

+0

let editMenu = NSMenu (название: «Изменить») – Astin

+0

Мне понравилось это, https://gist.github.com/AstinCHOI/9791f4b0ab941a2be6da. но это не сработало. Спасибо за вашу помощь. – Astin

0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html

Автоматическое меню Включение

  • Если цель пункта меню не установлен (то есть, если она равна нулю, как правило, если пункт меню подключен к первому Responder), а объект NSMenu - , а не контекстное меню, затем NSMenu использует цепочку ответчиков (описана i n Цепочка ответчика), чтобы определить цель. Если есть нет объекта в цепочке ответчиков, которая реализует действие элемента, элемент отключен. Если есть объект в цепочке ответчиков, который реализует действие элемента, NSMenu затем проверяет, реализует ли этот объект метод или validateUserInterfaceItem:. Если оно не, то пункт меню включен. Если это так, то статус статуса пункта меню - , определяемый возвращаемым значением метода.

Итак, для того, чтобы достичь Автоматического меню Включения для стандартных пунктов меню системы мы должны указать правильный action без установки target.

let menu = NSMenu(...) 
menu.addItem(withTitle: "Quit \(applicationName)", 
      action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q") 
menu.addItem(withTitle: "Select All", 
      action: #selector(NSText.selectAll(_:)), keyEquivalent: "a") 
menu.addItem(withTitle: "Copy", 
      action: #selector(NSText.copy(_:)), keyEquivalent: "c") 
Смежные вопросы