从 Nib 加载 NSView 的多个实例

Posted

技术标签:

【中文标题】从 Nib 加载 NSView 的多个实例【英文标题】:Load multiple instances of a NSView from Nib 【发布时间】:2017-01-09 20:10:57 【问题描述】:

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

这就是我所做的:

首先我创建了 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))

由于某些原因,这段代码给了我一个奇怪的错误。它第一次工作,只有一个变量,但如果我放置多个变量,它说它不能在 NSView 中转换 NSWindow 类型。

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

我认为出现此错误是因为有时第一个***对象是视图,有时是窗口。所以我越来越糊涂了。

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

let view = top[0] as! NSView

那么这里有什么问题呢?

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

【问题讨论】:

当你创建你的.xib文件时,你选择了哪种风格的xib? 什么意思?我刚刚创建了一个视图:文件 > 新建 > 文件 > 视图。 当我告诉 Xcode 创建一个界面文件时,它为我提供了 Application、View、Empty、Storyboard 选项......我假设 Application 类型不是你想要的......但它可能成为你所拥有的。 我选择了视图 不要假设视图是top[0],它可以是top的另一个元素。 【参考方案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

【讨论】:

以上是关于从 Nib 加载 NSView 的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 以编程方式从 NSView 的子类加载对象

从 nib 文件加载的 NSView 已禁用控件并且操作也不起作用

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

从 NIB 加载后 IBOutlet 实例为(空)

添加为子视图的 NSView 不显示

无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”