A segmented control is a convenient replacement for the iOS tabbar, as it also groups related segments and only allows one of them to be active.
It is basically just another type of NSToolbarItem. Thus, the process is very similar to how you set up a toolbar with elements before.
- Define a identifier
- Return the identifiers
- For the new identifier, return a segmented control
- Set up an action and target for the segmented control
As a bonus point, you can tell the toolbar that the segmented control should be the centered item in the toolbar (much like with a tabbar).
In this example, we also have a UITabBar that we're hiding, so that the switching of the visible view controller is still handled by the hidden tabbar.
Here is the necessary code:
class SceneDelegate: UIResponder, UIWindowSceneDelegate, NSToolbarDelegate {
// We need a toolbar identifier
static let SegmentedItemToolbarIdentifier = NSToolbarItem.Identifier(rawValue: \"PrimaryGroup\")
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
#if targetEnvironment(UIKitForMac)
if let windowScene = scene as? UIWindowScene {
if let titlebar = windowScene.titlebar {
let toolbar = NSToolbar(identifier: \"NerauToolbar\")
let rootViewController = window?.rootViewController as? UITabBarController
// Hide the tabbasr
rootViewController?.tabBar.isHidden = true
toolbar.delegate = self
// Our segmented control should be centered
toolbar.centeredItemIdentifier = SceneDelegate.SegmentedItemToolbarIdentifier
titlebar.titleVisibility = .hidden
titlebar.toolbar = toolbar
}
}
#endif
}
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
if (itemIdentifier == SceneDelegate.SegmentedItemToolbarIdentifier) {
// Create a new group item that hosts two buttons
let group = NSToolbarItemGroup(itemIdentifier: SceneDelegate.SegmentedItemToolbarIdentifier,
titles: [\"Startpage\", \"Categories\"],
selectionMode: .selectOne,
labels: [\"section1\", \"section2\"],
target: self,
action: #selector(toolbarGroupSelectionChanged))
// Set the initial selection
group.setSelected(true, at: 0)
return group
}
return nil
}
@objc func toolbarGroupSelectionChanged(sender: NSToolbarItemGroup) {
// This is called when the user changes the selection
// Notice how we get the tab bar controller and change the selection there
let rootViewController = window?.rootViewController as? UITabBarController
rootViewController?.selectedIndex = sender.selectedIndex
}
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [SceneDelegate.SegmentedItemToolbarIdentifier,
NSToolbarItem.Identifier.flexibleSpace]
}
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return self.toolbarDefaultItemIdentifiers(toolbar)
}
}
