从Nib

时间:2017-01-09 20:10:57

标签: cocoa swift3 nsview nib swift3.0.2

我想知道是否有一种方法可以在xib文件中创建视图,然后将其插件连接到一个类,因此您可以创建该类的多个实例并将它们放在窗口中。 我有一些问题,你可以帮我修改我的代码吗?

这就是我的所作所为:

首先,我创建了2个文件:CustomView.xib和CustomView.swift。 然后我设计了将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")
}

所以我继续创建该类的两个变量并将其放在窗口上:

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))

由于某些原因,这段代码给了我一个奇怪的错误。它第一次使用一个变量,但如果我放置多个变量,它表示它无法在NSView中投射NSWindow类型。

  

无法转换类型的值' NSApplication' (0x7fffb5cf3ef0)到' NSView' (0x7fffb5d04bb0)。

enter image description here

我认为这个错误是因为有时第一个顶级对象是视图,有时候它是窗口。所以我感到困惑。

显然,这一行引发了错误:

let view = top[0] as! NSView

那么这里的问题是什么?

(请不要用可可触控代码回答)

1 个答案:

答案 0 :(得分: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
}