无法修改 NSTabViewItem



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

  • 我有一个选项卡视图控制器(样式 = 工具栏(
  • 我有一个"表"选项卡视图
  • 我有 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 连接(而且我似乎无论如何都无法连接选项卡项(。 如果这是一个微不足道的问题,请道歉,但我到处搜索,没有找到任何可以帮助我的东西。

谢谢

你说:

  • 我有一个"表"选项卡视图

这是你的问题。NSTabView仅要求NSTabViewItemdrawLabelNSTabView本身是否负责绘制选项卡栏,但您有一个"表格"选项卡视图。("表格"是将NSTabViewController拖到情节提要中的默认样式。

你还说:

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

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

请注意,仅当设置了toolbarItem.view时,才会使用minSizemaxSize属性。

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

我还对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,它仍然不会更改 grac(并且未达到覆盖的 sizeOfLabel 函数(。

最新更新