在我的macOS应用程序中,我试图在NSToolbar中复制NSSegmentedControl的Photos.app实现以控制NSTabViewController。作为参考,以下是它的样子:

因此,我的做法如下:
NSTabView头NSToolbarNSSegmentedControl作为NSToolbarItem。#selector侦听对NSSegmentedControl的更改。下面是当前的实现:
class WindowController: NSWindowController, NSToolbarDelegate {
// MARK: - Identifiers
let mainToolbarIdentifier = NSToolbar.Identifier("MAIN_TOOLBAR")
let segmentedControlIdentifier = NSToolbarItem.Identifier("MAIN_TABBAR")
// MARK: - Properties
var tabBar: NSSegmentedControl? = NSSegmentedControl(labels: ["One", "Two"], trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(didSwitchTabs))
var toolbar: NSToolbar?
var tabBarController: NSTabViewController?
// MARK: - Life Cycle
override func windowDidLoad() {
super.windowDidLoad()
self.toolbar = NSToolbar(identifier: mainToolbarIdentifier)
self.toolbar?.allowsUserCustomization = false
self.toolbar?.delegate = self
self.tabBar?.setSelected(true, forSegment: 0)
self.tabBarController = self.window?.contentViewController as? NSTabViewController
self.tabBarController?.selectedTabViewItemIndex = 0
self.window?.toolbar = self.toolbar
}
// MARK: - NSToolbarDelegate
public func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
var toolbarItem: NSToolbarItem
switch itemIdentifier {
case segmentedControlIdentifier:
toolbarItem = NSToolbarItem(itemIdentifier: segmentedControlIdentifier)
toolbarItem.view = self.tabBar
case NSToolbarItem.Identifier.flexibleSpace:
toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
default:
fatalError()
}
return toolbarItem
}
public func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [segmentedControlIdentifier, NSToolbarItem.Identifier.flexibleSpace]
}
public func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [NSToolbarItem.Identifier.flexibleSpace, segmentedControlIdentifier, NSToolbarItem.Identifier.flexibleSpace]
}
// MARK: - Selectors
@objc func didSwitchTabs(sender: Any) {
let segmentedControl = sender as! NSSegmentedControl
if (segmentedControl.selectedSegment == 0) {
self.tabBarController?.selectedTabViewItemIndex = 0
} else if (segmentedControl.selectedSegment == 1) {
self.tabBarController?.selectedTabViewItemIndex = 1
}
}
}在这里,它正在发挥作用:

现在,我对macOS开发还不熟悉,这似乎是解决这个问题的一种非常复杂和复杂的方法。有没有更简单的方法可以让我实现同样的目标?也许是在界面生成器中?在这方面可以做些什么来改进呢?我做错了什么?
耽误您时间,实在对不起。
发布于 2020-05-13 03:26:45

对于任何在工具栏上实现NSSegmentedControl并且没有触发IBAction的人,我都遇到了同样的问题,并且花了半天时间来解决这个问题。问题是,我将我的分段连接到NSWindowController类。
要解决这个问题,请创建NSWindow的子类,将该类设置为故事板上窗口的基类,然后创建@IBOutlet @IBAction链接到NSWindow。请记住,将其与NSWindowController链接将不起作用。
https://stackoverflow.com/questions/45688614
复制相似问题