Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to set submenu for NSMenuItem (FinderSync extension)

I'm trying to create a cascade submenu for a Finder Sync extension in Swift/Cocoa. I have the following code:

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
}

So what I'm trying to achieve is:

item1->
       item2 
item11

So what I actually get is a flat item1 and item11 menu list.

Any hints?


I filed a bug with Apple (#18810635), got a response that it's a duplicate of (#18531883) which is still open.

Posted the copy of the filing at OpenRadar http://openradar.appspot.com/radar?id=5772557445758976 , tweeted to a developer advocate.

If anyone knows the fate of #18531883 - this is core raison d'être for Finder Sync Extensions?

like image 775
Krzysztof Rosiński Avatar asked Oct 14 '14 11:10

Krzysztof Rosiński


1 Answers

I've upgraded the project to Swift 2.0, and finally made a working submenu. Posting the solution:

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
}

This will only work on Mac OS 10.11+, 10.10.5 still has the bug being unable to generate a submenu. So a good appraoch is generating a flat menu for < 10.11, and a cascade starting from el capitan.

like image 143
Krzysztof Rosiński Avatar answered Nov 15 '22 13:11

Krzysztof Rosiński