gpt4 book ai didi

macos - 在NSToolbar中实现NSSegmentedControl来控制NSTabViewController

转载 作者:行者123 更新时间:2023-12-03 16:21:54 46 4
gpt4 key购买 nike

在我的 macOS 应用程序中,我尝试在 NSToolbar 中复制 NSSegmentedControl 的 Photos.app 实现来控制 NSTabViewController。作为引用,如下所示:

Photos.app in macOS Sierra.

所以,我的方法如下:

  1. 使用 Interface Builder 隐藏默认的 NSTabView header
  2. 以编程方式添加 NSToolbar
  3. 插入 NSSegmentedControl 作为 NSToolbarItem
  4. 使用#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
}
}

}

而且,它正在发挥作用:

Implementing NSSegmentedControl in NSToolbar to control NSTabViewController.

现在,我是 macOS 开发的新手,感觉这是解决这个问题的一种非常复杂且令人费解的方法。有没有更简单的方法可以实现同样的目标?也许在 Interface Builder 中以某种方式?这里可以做些什么来改进?我做错了什么?

感谢您的宝贵时间。

最佳答案

enter image description here对于任何在工具栏上实现 NSSegmentedControl 并且它没有触发 IBAction 的人,我遇到了同样的问题并花了半天的时间来解决这个问题。问题是我将分段与 NSWindowController 类连接起来。

要解决此问题,请创建 NSWindow 的子类,将该类设置为 Storyboard上窗口的基类,然后创建指向 NSWindow 的 @IBOutlet @IBAction 链接。请记住,将其与 NSWindowController 链接将不起作用。

关于macos - 在NSToolbar中实现NSSegmentedControl来控制NSTabViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45688614/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com