Невозможно установить подменю для 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?
Другие вопросы по тегам