0

xib ファイルでビューを作成し、そのアウトレットをクラスに接続する方法があるかどうか疑問に思っていたので、そのクラスの複数のインスタンスを作成してウィンドウに配置できます。いくつか問題があるので、コードの修正を手伝ってもらえますか?

これが私がしたことです:

まず、CustomView.xib と CustomView.swift の 2 つのファイルを作成しました。次に、NSImageView をカスタム ビューに追加するインターフェイスを設計しました。ファイルの所有者をクラス名に設定し、NSImageView からのアウトレットをクラスに追加しました。

次に、nib からインターフェイスをロードする次の関数を作成しました。

func loadView() -> NSView {
    var top = NSArray()
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &top)
    let view = top[0] as! NSView
    return view
}

そして、インターフェイスをロードするようにクラスをセットアップします。

override init(frame: CGRect) {
    super.init(frame: frame)
    let view = loadView()
    view.frame = bounds
    addSubview(view)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

そこで、そのクラスの 2 つの変数を作成し、ウィンドウに配置しました。

var x = CustomView(frame: CGRect(x: 0, y: 0, width: 600, height: 105))
var y = CustomView(frame: CGRect(x: 0, y: 105, width: 600, height: 105))

そして、何らかの理由で、このコードで奇妙なエラーが発生します。1 つの変数で初めて機能しましたが、複数配置すると、NSView で NSWindow タイプをキャストできなかったと表示されます。

タイプ 'NSApplication' (0x7fffb5cf3ef0) の値を 'NSView' (0x7fffb5d04bb0) にキャストできませんでした。

ここに画像の説明を入力

最初の最上位オブジェクトがビューである場合もあれば、ウィンドウである場合もあるために、このエラーが発生すると思います。だから私は混乱しています。

明らかに、この行でエラーがスローされます。

let view = top[0] as! NSView

では、ここで何が問題なのですか?

(ココアタッチコードで回答しないでください)

4

1 に答える 1

1

filter関数を使用してNSViewインスタンスを取得する

func loadView() -> NSView {
    var topLevelObjects = NSArray()
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &topLevelObjects)
    let views = (topLevelObjects as Array).filter { $0 is NSView }        
    return views[0] as! NSView
}
于 2017-01-10T16:42:20.520 に答える