无法为NSMenuItem(FinderSync扩展)设置子菜单

时间:2014-10-14 11:54:25

标签: macos cocoa swift xcode6 xcode6gm

我正在尝试在Swift / Cocoa中为Finder Sync扩展创建一个级联子菜单。我有以下代码:

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

所以我实际得到的是一个平坦的item1item11菜单列表。

任何提示?


我向Apple提交了一个错误(#18810635),得到的答复是它(#18531883)的副本仍然是开放的。

在OpenRadar http://openradar.appspot.com/radar?id=5772557445758976上发布了文件副本,并发送给开发者倡导者。

如果有人知道#18531883的命运 - 这是Finder Sync Extensions的核心存在理由?

3 个答案:

答案 0 :(得分:3)

我已将项目升级到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开始的级联。

答案 1 :(得分:0)

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
    }

答案 2 :(得分:0)

Finder Sync Extensions在macOS 10.11之前的版本中不支持子菜单。

在检查FIFinderSyncProtocol标头时,代码文档中对此进行了说明:

使用特定的菜单项属性:标题,操作,图像和启用的。 从10.11开始:标记,状态和缩进级别也可以使用,并且允许子菜单

optional func menu(for menu: FIMenuKind) -> NSMenu?