NSTabView:工具栏无法显示

时间:2018-01-03 12:38:17

标签: macos nstoolbar nstabview

macOS 10.12.6; Xcode 9.3,故事板

我有一个NSTabView(tabless),它本身包含两个NSTabViews。一个是tabless,另一个是使用'工具栏'风格。

当我启动我的应用程序时,工具栏可见,一切都很好:它在工具栏中显示我的标签,我可以更改它们等等。一旦我切换到我的故事板的另一个分支,工具栏就会消失......当我回来时,而不是一个工具栏,用按钮和所有这些,我得到一个稍微加宽的栏,里面没有任何内容。

我已经设置了一个示例项目来显示我的问题,在哪里 - 为了便于切换 - 我已经离开了另外两个tabViewControllers来显示他们的标签(底部/顶部,但这没有区别)。

1)首次运行(从'工具栏'分支开始):first run; toolbar visible 2)(未显示):切换到' top'科 3)切换回工具栏':return to branch, toolbar not displayed correctly

作为诊断辅助工具,我创建了一个显示工具栏状态' AppController中的IBAction:

@IBAction func displayToolbarStatus(_ sender: NSMenuItem){
    if let window = NSApplication.shared.windows.first {
        print(window.toolbar?.isVisible)
    }
}

结果如下: 1)可选(true) 2)没有 3)可选(true)

这与事物应该如何工作非常一致:工具栏存在并显示,没有工具栏,工具栏存在并显示。当然,只有作为工具栏才可用。 (关闭和打开可见性,或尝试使用window.toolbar强制更改大小?.sizeMode = .regular没有任何效果,也没有为工具栏项指定图标;工具栏仍然被压扁而没有正常工作的按钮。

我还没有与NSToolbar深入合作:这是一个已知问题的解决方法;这是Xcode 9.2的新功能(毕竟,它认为没有窗口是有效的,所以在该字段中显然存在一些问题)?

我真的想使用NSTabView'工具栏'功能:我该如何处理?

1 个答案:

答案 0 :(得分:0)

我现在有更多时间玩工具栏。非响应工具栏的“奇怪”外观只是一个空工具栏,它给了我一个关于发生了什么的线索。

0)NSTabView覆盖窗口的工具栏;当它消失时它不会回击控制;这意味着,如果您的窗口中有另一个工具栏,那么当您使用带有“工具栏”样式的NSTabView时,该工具栏将永远不会出现。

1)我已经为ToolbarTabViewController中的每个相关方法添加了一个print语句,并在包含TabViewController的DidSelect TabViewItem中添加了一个'Switching Tabs',以及在将Toolbar项添加到窗口时进行记录。 (ToolbarTabViewController是包含TabViewController的第二个控制器;它被选中。否则堆栈看起来略有不同):

ViewDidLoad 
Switching tabs 
viewWillAppear 
viewDidAppear 
Switching tabs
Toolbar will add item 
Toolbar will add item 
viewWillAppear
viewDidAppear

切换到另一个标签:

viewWillDisappear
Switching tabs
Toolbar did remove item
Toolbar did remove item
viewDidDisappear

到目前为止,这么好。

切换回ToolbarTabController,我们得到

viewWillAppear
Switching tabs
viewDidAppear

无论调用哪种方法,在第一次出现时将与标签相关的项添加到工具栏中都不会再次调用。 (另请注意,切换标签和viewDidAppear的顺序在第一次和后续出现之间不一致。)

2)因此,合乎逻辑的做法似乎是捕获正在创建的项目并将其添加回以供将来的迭代使用。在ToolbarTabViewController中:

 var defaultToolbarItems: [NSToolbarItem] = []

    @IBAction  func addTabsBack(_ sender: Any){
            if let window = NSApplication.shared.windows.first {
                if let toolbar = window.toolbar{
                    for (index, item) in defaultToolbarItems.enumerated() {
                        toolbar.insertItem(withItemIdentifier: item.itemIdentifier, at: index)
                    }
                }
            }
        }

override func toolbarWillAddItem(_ notification: Notification) {
       // print("Toolbar will add item")
        if let toolbarItem = notification.userInfo?["item"] as? NSToolbarItem {
            if defaultToolbarItems.count < tabView.numberOfTabViewItems{
                 defaultToolbarItems.append(toolbarItem)
            }
        }
    }

3)最后一个问题是何时(以及何处)调用addTabsBack() - 我发现如果我尝试在viewWillAppear中调用它,我会从四个toolbarItem开始,尽管tabViewItems的数量是2。(和事实上,它们似乎是重复的:同名,相同的功能)。因此,我在周围的TabViewController的'didSelect TabViewItem'方法中调用addTabsBack() - willSelect太早了;但didSelect给了我完全我需要的功能。

4)可能有更优雅的方法来捕获活动的toolbarItems,但是现在,我有一个可行的解决方案。