Невозможно установить подменю для NSMenuItem (расширение FinderSync)
Я пытаюсь создать каскадное подменю для расширения Finder Sync в Swift/Cocoa. У меня есть следующий код:
override func menuForMenuKind(menuKind: FIMenuKind) -> NSMenu! {
let m = NSMenu(title: "")
let mi1 = NSMenuItem(title: "item1", action: nil, keyEquivalent: "")
let mi11 = NSMenuItem(title: "item11", action: nil, keyEquivalent: "")
let m2 = NSMenu(title: "")
let mi2 = NSMenuItem(title: "item2", action: nil, keyEquivalent: "")
m2.addItem(mi2)
m.addItem(mi1)
m.addItem(mi11)
m.setSubmenu(m2, forItem: mi1)
return m
}
Итак, что я пытаюсь достичь:
item1->
item2
item11
Так что я на самом деле получаю квартиру item1
а также item11
список меню.
Есть намеки?
Я подал ошибку в Apple (#18810635), получил ответ, что это дубликат (#18531883), который все еще открыт.
Выложил копию заявки на OpenRadar http://openradar.appspot.com/radar?id=5772557445758976, написал в твиттере адвокат разработчика.
Если кто-нибудь знает судьбу #18531883 - это основной смысл Finder Sync Extensions?
1 ответ
Я обновил проект до Swift 2.0 и, наконец, сделал рабочее подменю. Размещение решения:
override func menuForMenuKind(menuKind: FIMenuKind) -> NSMenu! {
let main = NSMenu()
let submenu = NSMenu()
let mainDropdown = NSMenuItem(title: "Some option group", action: nil, keyEquivalent: "")
main.addItem(mainDropdown)
m.setSubmenu(submenu, forItem: mainDropdown)
submenu.addItem(NSMenuItem(title: "Option 1", action: nil, keyEquivalent: ""))
submenu.addItem(NSMenuItem(title: "Option 2", action: nil, keyEquivalent: ""))
return main
}
Это будет работать только в Mac OS 10.11+, в 10.10.5 по-прежнему есть ошибка, из-за которой невозможно создать подменю. Таким образом, хороший appraoch генерирует плоское меню для <10.11, и каскад, начинающийся с el capitan.
func constructMenu() {
let main = NSMenu()
let submenu = NSMenu()
let mainDropdown = NSMenuItem(title: "Some option group", action: nil, keyEquivalent: "")
main.addItem(mainDropdown)
main.setSubmenu(submenu, for: mainDropdown)
submenu.addItem(NSMenuItem(title: "Option 1", action: nil, keyEquivalent: ""))
submenu.addItem(NSMenuItem(title: "Option 2", action: nil, keyEquivalent: ""))
// myList.setSubmenu(mylist2, for: myList)
statusItem.menu = main
}
Расширения Finder Sync Extensions не поддерживают подменю в версиях до macOS 10.11.
Об этом говорится в документации по коду, когда вы исследуете FIFinderSyncProtocol
заголовок:
Используются определенные свойства пункта меню: заголовок, действие, изображение и включено. Начиная с версии 10.11: tag, state и indentationLevel также работают, и разрешены подменю.
optional func menu(for menu: FIMenuKind) -> NSMenu?