Как отметил @ frédéric-blanc: единственный способ достичь этого - программно NSToolbarItemGroup
.
Хитрость заключается в назначении массива view
и subitems
для NSToolbarItemGroup
.
let group = NSToolbarItemGroup(itemIdentifier: "NavigationGroupToolbarItem")
let itemA = NSToolbarItem(itemIdentifier: "PrevToolbarItem")
itemA.label = "Prev"
let itemB = NSToolbarItem(itemIdentifier: "NextToolbarItem")
itemB.label = "Next"
let segmented = NSSegmentedControl(frame: NSRect(x: 0, y: 0, width: 85, height: 40))
segmented.segmentStyle = .TexturedRounded
segmented.trackingMode = .Momentary
segmented.segmentCount = 2
// Don't set a label: these would appear inside the button
segmented.setImage(NSImage(named: NSImageNameGoLeftTemplate)!, forSegment: 0)
segmented.setWidth(40, forSegment: 0)
segmented.setImage(NSImage(named: NSImageNameGoRightTemplate)!, forSegment: 1)
segmented.setWidth(40, forSegment: 1)
// `group.label` would overwrite segment labels
group.paletteLabel = "Navigation"
group.subitems = [itemA, itemB]
group.view = segmented
Если вы хотите побаловаться, см. Пример кода приложения ниже.
Пример приложения
Это все, что вам нужно для нового образца приложения OS X / Cocoa: перезаписать AppDelegate.swift
следующими строками кода:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSToolbarDelegate {
@IBOutlet weak var window: NSWindow!
var toolbar: NSToolbar!
let toolbarItems: [[String: String]] = [
["title" : "irrelevant :)", "icon": "NSPreferencesGeneral", "identifier": "NavigationGroupToolbarItem"],
["title" : "Share", "icon": NSImageNameShareTemplate, "identifier": "ShareToolbarItem"],
["title" : "Add", "icon": NSImageNameAddTemplate, "identifier": "AddToolbarItem"]
]
var toolbarTabsIdentifiers: [String] {
return toolbarItems.flatMap { $0["identifier"] }
}
func applicationDidFinishLaunching(aNotification: NSNotification) {
toolbar = NSToolbar(identifier: "TheToolbarIdentifier")
toolbar.allowsUserCustomization = true
toolbar.delegate = self
self.window?.toolbar = toolbar
}
func toolbar(toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: String, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
guard let infoDictionary: [String : String] = toolbarItems.filter({ $0["identifier"] == itemIdentifier }).first
else { return nil }
let toolbarItem: NSToolbarItem
if itemIdentifier == "NavigationGroupToolbarItem" {
let group = NSToolbarItemGroup(itemIdentifier: itemIdentifier)
let itemA = NSToolbarItem(itemIdentifier: "PrevToolbarItem")
itemA.label = "Prev"
let itemB = NSToolbarItem(itemIdentifier: "NextToolbarItem")
itemB.label = "Next"
let segmented = NSSegmentedControl(frame: NSRect(x: 0, y: 0, width: 85, height: 40))
segmented.segmentStyle = .TexturedRounded
segmented.trackingMode = .Momentary
segmented.segmentCount = 2
// Don't set a label: these would appear inside the button
segmented.setImage(NSImage(named: NSImageNameGoLeftTemplate)!, forSegment: 0)
segmented.setWidth(40, forSegment: 0)
segmented.setImage(NSImage(named: NSImageNameGoRightTemplate)!, forSegment: 1)
segmented.setWidth(40, forSegment: 1)
// `group.label` would overwrite segment labels
group.paletteLabel = "Navigation"
group.subitems = [itemA, itemB]
group.view = segmented
toolbarItem = group
} else {
toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
toolbarItem.label = infoDictionary["title"]!
let iconImage = NSImage(named: infoDictionary["icon"]!)
let button = NSButton(frame: NSRect(x: 0, y: 0, width: 40, height: 40))
button.title = ""
button.image = iconImage
button.bezelStyle = .TexturedRoundedBezelStyle
toolbarItem.view = button
}
return toolbarItem
}
func toolbarDefaultItemIdentifiers(toolbar: NSToolbar) -> [String] {
return self.toolbarTabsIdentifiers;
}
func toolbarAllowedItemIdentifiers(toolbar: NSToolbar) -> [String] {
return self.toolbarDefaultItemIdentifiers(toolbar)
}
func toolbarSelectableItemIdentifiers(toolbar: NSToolbar) -> [String] {
return self.toolbarDefaultItemIdentifiers(toolbar)
}
func toolbarWillAddItem(notification: NSNotification) {
print("toolbarWillAddItem", (notification.userInfo?["item"] as? NSToolbarItem)?.itemIdentifier ?? "")
}
func toolbarDidRemoveItem(notification: NSNotification) {
print("toolbarDidRemoveItem", (notification.userInfo?["item"] as? NSToolbarItem)?.itemIdentifier ?? "")
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}