首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSegmentedControl动作不开火

NSSegmentedControl动作不开火
EN

Stack Overflow用户
提问于 2018-02-02 21:32:55
回答 2查看 816关注 0票数 0

我没有使用任何故事板/NIBs,而是以编程方式创建我的所有UI。

这里是主窗口控制器:

代码语言:javascript
复制
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
        }
    }

}

我在窗口的一个NSTabViewController中嵌入了三个NSTabViewController。我希望能够将它们连接到我的NSSegmentedControl中选择的NSToolbar

然而,action永远不会被解雇。switchTabs方法永远不会被调用。如果我直接调用这个函数,它就能工作!但是,当我选择一个NSSegmentedCell时,什么都不会发生。

这里出什么问题了?

我是否正确地执行窗口的实例化?我对loadWindow的使用正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 04:01:17

在当前的设置中,我无法让它工作,所以我将targetaction设置为该类中的NSTabViewControllerselector

票数 0
EN

Stack Overflow用户

发布于 2018-02-03 17:59:51

我已经用一个简单的MainSplitViewController子类替换了您的NSViewController子类,并使用了它自己的nib (因为只有那么多‘在代码中创建接口’我愿意做‘),而且它运行得很好--工具栏被创建了,片段启动了它们的操作,selectedSegment报告了正确的标记。

这使得您的contentViewController及其相关视图成为最有可能的罪魁祸首:您的工具栏代码运行良好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48591161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档