【发布时间】:2017-12-27 18:14:46
【问题描述】:
我正在尝试从 xib 文件加载视图。我想做的事情对我来说似乎很简单,但由于某种原因,它比我想象的要困难得多。我只是有一个自定义视图(带有标签、按钮和表格视图),我想在同一个窗口中(在堆栈视图中)多次重复使用它。这是我的自定义视图代码
class PlatformView: NSView {
@IBOutlet var testLabel: NSTextField!
required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
}
override func awakeFromNib() {
super.awakeFromNib()
self.testLabel.stringValue = "Init"
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
}
}
这是我在视图中的视图确实加载了主视图控制器。我做了两次,因为我在堆栈视图中需要两个相同的视图。问题是我遇到了一个错误。这条线是 nil let topLevelObjects = objectArray2?.firstObject as? PlatformView 并引起了很多问题。这只在我运行应用程序时有时会发生。这是非常随机的,我不知道为什么会这样。有一个更好的方法吗?还是我在代码中做错了什么?
var objectArray:NSArray?
guard let nib = NSNib(nibNamed: NSNib.Name(rawValue: "PlatformView"), bundle: nil) else {return}
if nib.instantiate(withOwner: self, topLevelObjects: &objectArray), let topLevelObjects = objectArray?.firstObject as? PlatformView {
self.platformStackView.addArrangedSubview(topLevelObjects)
self.firstPlatformView = topLevelObjects
}
if nib.instantiate(withOwner: self, topLevelObjects: &objectArray), let topLevelObjects = objectArray?.firstObject as? PlatformView {
self.platformStackView.addArrangedSubview(topLevelObjects)
self.secondPlatformView = topLevelObjects
}
【问题讨论】:
-
不能保证firstObject就是你要找的PlatformView。可以有多个顶级对象,因此您应该为所需的 PlatformView 检查它们。在我的测试中,我在 XIB 文件中只有一个视图(带有子视图),但界面构建器还添加了一些我需要忽略的其他内容。在我的测试中,顶层对象是我的 TestView 和 NSApplication 的一个实例。我必须检查数组以获取第二项 TestView。