首页 > 解决方案 > 无法修改 NSTabViewItem

问题描述

我可能会迷失在一杯水中,因为我不是经验丰富的开发人员,但我似乎无法实现简单的覆盖来修改 NSTabView 项目的大小。

我创建了一个新的 NSTabViewItem 子类:MyTabViewItem 并将 3 个选项卡项中的一个子类化。代码是:

import Cocoa

class MyTabViewItem: NSTabViewItem {

    override func drawLabel(_ shouldTruncateLabel: Bool, in labelRect: NSRect) {

        var size = self.sizeOfLabel(false)
        size.width = 180 
        print("Draw!!")         
    }


    override func sizeOfLabel(_ computeMin: Bool) -> NSSize {

        var size = super.sizeOfLabel(false)      
        size.width = 180      
        print("Draw!!")
        return size      
    }       
}

一切正常,除了子类化。选项卡出现,它们确实通过切换视图来操作,程序按应有的方式运行。除了它不会调整选项卡项的大小。永远不会到达子类 MyTabViewItem 中的代码(它永远不会打印 Draw!! 应该如此。

我无法理解我在这里缺少什么。我还没有读过要建立的任何 IB 连接(而且我似乎无论如何都无法连接选项卡项)。如果这是一个微不足道的问题,请道歉,但我到处搜索并没有找到任何可以帮助我的东西。

谢谢

标签: swiftcocoanstabview

解决方案


你说:

  • 我有一个 Tabless 选项卡视图

这是你的问题。AnNSTabView仅询问其NSTabViewItem本身是否负责绘制标签栏,但您有一个“Tabless”标签视图。(“Tabless”是拖入情节提要时的默认样式。)drawLabelNSTabViewNSTabViewController

你还说:

  • 我有一个选项卡视图控制器(样式 = 工具栏)

所以你甚至不希望标签视图绘制标签栏;您希望窗口工具栏中的项目选择选项卡(就像在 Xcode 的首选项窗口中一样)。

您自定义为选项卡创建的工具栏项目的能力是有限的。您可以子类化NSTabViewController和覆盖toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:,如下所示:

override func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
    let toolbarItem = super.toolbar(toolbar, itemForItemIdentifier: itemIdentifier, willBeInsertedIntoToolbar: flag)
    if
        let toolbarItem = toolbarItem,
        let tabViewItem = tabViewItems.first(where: { ($0.identifier as? String) == itemIdentifier.rawValue })
    {
        toolbarItem.label = "\(tabViewItem.label) "
    }
    return toolbarItem
}

但我发现进行其他更改效果不佳:

  • 设置toolbarItem.image对我来说效果不佳。
  • 设置toolbarItem.view使该项目停止接收点击。

请注意,minSizeandmaxSize属性仅在toolbarItem.view设置时使用。

您最好的选择可能是自己管理工具栏,而不是尝试使用NSTabViewController' 支持。


推荐阅读