2017-01-09 106 views
0

我想知道是否有方法在xib文件中创建一个视图,然后将它的插座连接到一个类,以便您可以创建该类的多个实例并将它们放置在窗口。 我有一些问题,所以你能帮我修复我的代码吗?从Nib加载NSView的多个实例

这里就是我所做的:

首先我创建2个文件:CustomView.xib和CustomView.swift。 然后我设计了添加一个NSImageView到自定义视图的界面。我将文件的所有者设置为类名称,并将NSImageView的插口添加到类中。

然后,我创建了下面的函数来加载从笔尖接口:

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

由于某些原因,此代码g给我一个奇怪的错误。它第一次使用一个变量,但如果我放置了多个变量,它说它不能在NSView中投射NSWindow类型。

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

enter image description here

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

显然引发错误在这条线:

let view = top[0] as! NSView 

所以这里有什么问题吗?

+0

(请不要用可可触摸代码回答)? –

+0

你是什么意思?我刚刚创建了一个View:File> New> File> View。 – Cristian

+0

当我告诉Xcode创建一个接口文件时,它给了我应用程序选项,视图,空白,故事板....我假设应用程序类型不是你想要的......但它可能是你得到的。 –

回答

1

使用filter功能当您创建的.xib文件,你选择哪个厦门国际银行的风格得到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 
}