由于我不是经验丰富的开发人员,所以我可能会迷失在一杯水中,但是我似乎无法实现简单的覆盖来修改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连接(无论如何我似乎都无法连接Tab项目)。如果这是一个琐碎的问题,请您道歉,但是我到处搜索,没有找到任何帮助。
谢谢
答案 0 :(得分:0)
您说:
- 我有一个Tabless Tab视图
这是您的问题。 NSTabView
仅要求NSTabViewItem
向drawLabel
询问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
使该项目停止获得点击。请注意,minSize
和maxSize
属性仅在设置了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函数)。