gpt4 book ai didi

cocoa - 从 Nib 加载 NSView 的多个实例

转载 作者:行者123 更新时间:2023-12-03 17:48:16 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以在 xib 文件中创建 View ,然后将其导出连接到一个类,这样您就可以创建该类的多个实例并将它们放置在窗口中。我遇到了一些问题,你能帮我修复我的代码吗?

这就是我所做的:

首先我创建了 2 个文件:CustomView.xib 和 CustomView.swift。然后我设计了将 NSImageView 添加到自定义 View 的界面。我将文件的所有者设置为类名,并将 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 类型。

Could not cast value of type 'NSApplication' (0x7fffb5cf3ef0) to 'NSView' (0x7fffb5d04bb0).

enter image description here

我认为出现此错误是因为有时第一个顶级对象是 View ,有时是窗口。所以我很困惑。

显然错误是在这一行抛出的:

let view = top[0] as! NSView

那么这里有什么问题吗?

(请勿使用cocoa touch代码回答)

最佳答案

使用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
}

关于cocoa - 从 Nib 加载 NSView 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com