xibファイルからビューをロードしようとしています。私がやりたいことは、私にとってはかなりシンプルなように思えますが、なんらかの理由で、私は思ったよりずっと難しいです。同じウィンドウ(スタックビュー)で何度も再利用したいカスタムビュー(ラベル、ボタン、テーブルビュー)があります。ここに私のカスタムビューのコードがありますXIBからビューをロードし、nil macOSアプリケーションを取得する
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.
}
}
ここに私のビューは、メインView Controllerの読み込みでした。スタックビューで同じビューを2つ表示する必要があるため、2回実行しています。問題は、エラーが発生していることです。この行はであり、多くの問題を引き起こしています。これは、アプリを実行するときにのみ発生します。それはかなり無作為で、私はなぜそれが起こっているのかわかりません。これを行うより良い方法はありますか?または私のコードで何か間違っているのですか?
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ファイル(サブビュー付き)には1つのビューしかありませんでしたが、インターフェースビルダーは無視する必要があるものも追加しました。私のテストでは、トップレベルのオブジェクトはTestViewとNSApplicationのインスタンスでした。私は2番目の項目だったTestViewを取得するために配列をチェックしなければならなかった。 –