NSSegmentedControl 操作未触发
NSSegmentedControl action not firing
我没有使用任何 Storyboards/NIBs,我正在以编程方式创建我的所有 UI。
这是主要的 window 控制器:
class MainWindowController: NSWindowController, NSToolbarDelegate {
var toolbar: NSToolbar!
var segmentedControl: NSSegmentedControl!
override func loadWindow() {
self.window = NSWindow(contentRect: .init(origin: .zero, size: .init(width: 640, height: 480)),
styleMask: NSWindow.StyleMask(rawValue: (NSWindow.StyleMask.closable.rawValue | NSWindow.StyleMask.titled.rawValue | NSWindow.StyleMask.miniaturizable.rawValue | NSWindow.StyleMask.resizable.rawValue)),
backing: .buffered, defer: true)
}
override init(window: NSWindow?) {
super.init(window: window)
loadWindow()
self.window?.center()
self.segmentedControl = NSSegmentedControl(labels: ["1", "2", "3"], trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs))
self.segmentedControl.setSelected(true, forSegment: 0)
self.toolbar = NSToolbar(identifier: .init("MainToolbar"))
self.toolbar.delegate = self
self.toolbar.displayMode = .iconOnly
self.window?.toolbar = self.toolbar
self.window?.contentViewController = MainSplitViewController()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Selectors
@objc func switchTabs(sender: Any) {
let segmentedControl = sender as! NSSegmentedControl
let tabVC = (self.window!.contentViewController as! MainSplitViewController!).tabViewController
tabVC.tabView.selectTabViewItem(at: segmentedControl.selectedSegment)
}
// MARK: - NSToolbarDelegate
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [
NSToolbarItem.Identifier.init("Add"),
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("NSSegmentedControl"),
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("Search")
]
}
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("NSSegmentedControl"),
NSToolbarItem.Identifier.init("Search"),
NSToolbarItem.Identifier.init("Add")
]
}
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
switch itemIdentifier {
case NSToolbarItem.Identifier.flexibleSpace:
return NSToolbarItem(itemIdentifier: itemIdentifier)
case NSToolbarItem.Identifier.init("NSSegmentedControl"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
toolbarItem.view = self.segmentedControl
return toolbarItem
case NSToolbarItem.Identifier.init("Search"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
let searchField = NSSearchField(frame: NSRect(origin: .zero, size: CGSize(width: 64, height: 64 )))
toolbarItem.view = searchField
return toolbarItem
case NSToolbarItem.Identifier.init("Add"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
let addButton = NSButton(title: "Add", target: self, action: nil)
toolbarItem.view = addButton
return toolbarItem
default:
return nil
}
}
}
我在 window 的 NSTabViewController
中嵌入了三个 NSViewControllers
。我希望能够将它们连接到我的 NSToolbar
.
中 NSSegmentedControl
的 selection
但是,action
永远不会被解雇。 switchTabs
方法永远不会被调用。如果我直接调用该函数,那么它就可以工作!但是当我 select a NSSegmentedCell
.
时什么也没有发生
这里出了什么问题?
我是否正确地实例化了 window?我对 loadWindow
的用法正确吗?
我已经将您的 MainSplitViewController 替换为一个简单的 NSViewController 子类,它有自己的笔尖(因为只有这么多 'creating the interface in code' 我愿意做),它运行得很好 - 工具栏被创建,段触发它们的操作,selectedSegment 报告正确的标记。
这使您的 contentViewController 及其关联的视图成为最有可能的罪魁祸首:您的工具栏代码工作正常。
我无法在当前设置中使用它,所以我将 target
和 action
设置为我的 NSTabViewController
和 selector
class.
我没有使用任何 Storyboards/NIBs,我正在以编程方式创建我的所有 UI。
这是主要的 window 控制器:
class MainWindowController: NSWindowController, NSToolbarDelegate {
var toolbar: NSToolbar!
var segmentedControl: NSSegmentedControl!
override func loadWindow() {
self.window = NSWindow(contentRect: .init(origin: .zero, size: .init(width: 640, height: 480)),
styleMask: NSWindow.StyleMask(rawValue: (NSWindow.StyleMask.closable.rawValue | NSWindow.StyleMask.titled.rawValue | NSWindow.StyleMask.miniaturizable.rawValue | NSWindow.StyleMask.resizable.rawValue)),
backing: .buffered, defer: true)
}
override init(window: NSWindow?) {
super.init(window: window)
loadWindow()
self.window?.center()
self.segmentedControl = NSSegmentedControl(labels: ["1", "2", "3"], trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs))
self.segmentedControl.setSelected(true, forSegment: 0)
self.toolbar = NSToolbar(identifier: .init("MainToolbar"))
self.toolbar.delegate = self
self.toolbar.displayMode = .iconOnly
self.window?.toolbar = self.toolbar
self.window?.contentViewController = MainSplitViewController()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Selectors
@objc func switchTabs(sender: Any) {
let segmentedControl = sender as! NSSegmentedControl
let tabVC = (self.window!.contentViewController as! MainSplitViewController!).tabViewController
tabVC.tabView.selectTabViewItem(at: segmentedControl.selectedSegment)
}
// MARK: - NSToolbarDelegate
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [
NSToolbarItem.Identifier.init("Add"),
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("NSSegmentedControl"),
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("Search")
]
}
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return [
NSToolbarItem.Identifier.flexibleSpace,
NSToolbarItem.Identifier.init("NSSegmentedControl"),
NSToolbarItem.Identifier.init("Search"),
NSToolbarItem.Identifier.init("Add")
]
}
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
switch itemIdentifier {
case NSToolbarItem.Identifier.flexibleSpace:
return NSToolbarItem(itemIdentifier: itemIdentifier)
case NSToolbarItem.Identifier.init("NSSegmentedControl"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
toolbarItem.view = self.segmentedControl
return toolbarItem
case NSToolbarItem.Identifier.init("Search"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
let searchField = NSSearchField(frame: NSRect(origin: .zero, size: CGSize(width: 64, height: 64 )))
toolbarItem.view = searchField
return toolbarItem
case NSToolbarItem.Identifier.init("Add"):
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
let addButton = NSButton(title: "Add", target: self, action: nil)
toolbarItem.view = addButton
return toolbarItem
default:
return nil
}
}
}
我在 window 的 NSTabViewController
中嵌入了三个 NSViewControllers
。我希望能够将它们连接到我的 NSToolbar
.
NSSegmentedControl
的 selection
但是,action
永远不会被解雇。 switchTabs
方法永远不会被调用。如果我直接调用该函数,那么它就可以工作!但是当我 select a NSSegmentedCell
.
这里出了什么问题?
我是否正确地实例化了 window?我对 loadWindow
的用法正确吗?
我已经将您的 MainSplitViewController 替换为一个简单的 NSViewController 子类,它有自己的笔尖(因为只有这么多 'creating the interface in code' 我愿意做),它运行得很好 - 工具栏被创建,段触发它们的操作,selectedSegment 报告正确的标记。
这使您的 contentViewController 及其关联的视图成为最有可能的罪魁祸首:您的工具栏代码工作正常。
我无法在当前设置中使用它,所以我将 target
和 action
设置为我的 NSTabViewController
和 selector
class.