从XIB加载视图并获取nil macOS应用程序

问题描述 投票:0回答:1

我正在尝试从xib文件加载视图。我想要做的事情对我来说似乎很简单,但由于某种原因,它比我想象的要困难得多。我只是有一个自定义视图(带有标签,按钮和tableviews),我想在同一个窗口中多次重复使用(在堆栈视图中)。这是我的自定义视图的代码

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.
    }
}

这是我在视图中查看主视图控制器的负载。我这样做了两次因为我在堆栈视图中需要两个相同的视图。问题是我收到了错误。这条线是零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
}
swift macos swift4
1个回答
0
投票

实例化返回XIB文件中的顶级对象数组,其中一些接口构建器本身可能已添加(如果您对它非常好奇,请​​参阅XIB的布局)。

简单的方法是为您的PlatformView搜索返回的topLevelObjects,如下所示:

if nib.instantiate(withOwner: self, topLevelObjects: &objectArray) {
    for object in topLevelObjects {
        if let platformView = object as? PlatformView {
            self.platformStackView.addArrangedSubview(platformView)
            self.firstPlatformView = platformView
        }
    }
}

但是假设您确定您的PlatformView在XIB中,更优雅的解决方案是这样的:

if nib.instantiate(withOwner: self, topLevelObjects: &objectArray) {
    if let topLevelObjects = objectArray {
        let platformView = topLevelObjects.flatMap({ object in return object as? PlatformView }).first!
        self.platformStackView.addArrangedSubview(platformView)
        self.firstPlatformView = platformView
    }
}

正如我所说的那样,你必须小心,因为可选择的力展开。

© www.soinside.com 2019 - 2024. All rights reserved.