从 Nib 加载 NSView 的多个实例
Load multiple instances of a NSView from Nib
我想知道是否有一种方法可以在 xib 文件中创建视图,然后将其出口连接到 class,这样您就可以创建 class 的多个实例并将它们放置在 window。
我有一些问题,你能帮我修复我的代码吗?
这是我所做的:
首先我创建了 2 个文件:CustomView.xib 和 CustomView.swift。
然后我设计了在自定义视图中添加 NSImageView 的界面。我将文件的所有者设置为 class 名称,并将 NSImageView 的出口添加到 class.
然后我创建了以下函数来从 nib 加载界面:
func loadView() -> NSView {
var top = NSArray()
Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &top)
let view = top[0] as! NSView
return view
}
并设置class加载界面:
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")
}
所以我继续创建 class 的两个变量并将其放在 window:
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 类型。
Could not cast value of type 'NSApplication' (0x7fffb5cf3ef0) to 'NSView' (0x7fffb5d04bb0).
我认为出现此错误是因为有时第一个顶级对象是视图,有时是 window。所以我很困惑。
显然错误是在这一行抛出的:
let view = top[0] as! NSView
那么这里有什么问题?
(请不要用cocoa触摸码回答)
使用filter
函数获取NSView
实例
func loadView() -> NSView {
var topLevelObjects = NSArray()
Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as Array).filter { [=10=] is NSView }
return views[0] as! NSView
}
我想知道是否有一种方法可以在 xib 文件中创建视图,然后将其出口连接到 class,这样您就可以创建 class 的多个实例并将它们放置在 window。 我有一些问题,你能帮我修复我的代码吗?
这是我所做的:
首先我创建了 2 个文件:CustomView.xib 和 CustomView.swift。 然后我设计了在自定义视图中添加 NSImageView 的界面。我将文件的所有者设置为 class 名称,并将 NSImageView 的出口添加到 class.
然后我创建了以下函数来从 nib 加载界面:
func loadView() -> NSView {
var top = NSArray()
Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &top)
let view = top[0] as! NSView
return view
}
并设置class加载界面:
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")
}
所以我继续创建 class 的两个变量并将其放在 window:
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 类型。
Could not cast value of type 'NSApplication' (0x7fffb5cf3ef0) to 'NSView' (0x7fffb5d04bb0).
我认为出现此错误是因为有时第一个顶级对象是视图,有时是 window。所以我很困惑。
显然错误是在这一行抛出的:
let view = top[0] as! NSView
那么这里有什么问题?
(请不要用cocoa触摸码回答)
使用filter
函数获取NSView
实例
func loadView() -> NSView {
var topLevelObjects = NSArray()
Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as Array).filter { [=10=] is NSView }
return views[0] as! NSView
}