无法修改NSTabViewItem

时间:2018-06-24 17:03:36

标签: swift cocoa nstabview

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

  • 我有一个Tab View Controller(样式=工具栏)
  • 我有一个Tabless Tab视图
  • 我有3个标签项。为了进行测试,我仅将其中一个子类划分为以下子类

我创建了一个新的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连接(无论如何我似乎都无法连接Tab项目)。如果这是一个琐碎的问题,请您道歉,但是我到处搜索,没有找到任何帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

您说:

  
      
  • 我有一个Tabless Tab视图
  •   

这是您的问题。 NSTabView仅要求NSTabViewItemdrawLabel询问NSTabView本身是否负责绘制选项卡栏,但是您具有“表”选项卡视图。 (将NSTabViewController拖到情节提要中时,“表格”是默认样式。)

您还说过:

  
      
  • 我有一个Tab View Controller(样式=工具栏)
  •   

因此,您甚至都不希望标签视图绘制标签栏。您希望窗口工具栏中的项目选择选项卡(例如在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使该项目停止获得点击。

请注意,minSizemaxSize属性仅在设置了toolbarItem.view的情况下使用。

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

答案 1 :(得分:0)

我也将NSTabViewController分为以下子类:

import Cocoa

class MyTabViewController: NSTabViewController {

    @IBOutlet weak var TradingTabItem: MyTabViewItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        print("Loaded Tab View")
        TradingTabItem.label = "New"

        // Do view setup here.

    }

}

现在发生的是,我的子类中的选项卡项(我子类中的3个中的唯一一个)确实将其标签字符串更改为New。但是,即使我在此处将项目添加为IBOutlet,它也不会改变捕获状态(并且无法达到覆盖的sizeOfLabel函数)。