我可能会迷失在一杯水中,因为我不是一个有经验的开发人员,但我似乎无法实现一个简单的覆盖来修改 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
仅要求NSTabViewItem
drawLabel
NSTabView
本身是否负责绘制选项卡栏,但您有一个"表格"选项卡视图。("表格"是将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
时,才会使用minSize
和maxSize
属性。
最好的办法可能是自己管理工具栏,而不尝试使用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 函数(。