gpt4 book ai didi

cocoa - Swift 3 加载 xib。 NSBundle.mainBundle().loadNibNamed 返回 Bool

转载 作者:行者123 更新时间:2023-12-03 16:05:51 34 4
gpt4 key购买 nike

我试图弄清楚如何使用 xib 文件创建自定义 View 。在此question使用下一个方法。

NSBundle.mainBundle().loadNibNamed("CardView", owner: nil, options: nil)[0] as! UIView

Cocoa也有同样的方法,但是这个方法在swift 3中已经变成了loadNibNamed(_:owner:topLevelObjects:) ,它返回Bool,而之前的代码会生成“Type Bool has no subscript Members”错误,这是显而易见的,因为返回类型是Bool .

所以,我的问题是如何在 Swift 3 中从 xib 文件加载 View

最佳答案

首先,该方法在 Swift 3 中没有改变。

loadNibNamed(_:owner:topLevelObjects:) 已在 macOS 10.8 中引入,并存在于 Swift 的所有版本中。然而 loadNibNamed(nibName:owner:options:) 已在 Swift 3 中被删除。

该方法的签名是

func loadNibNamed(_ nibName: String, 
owner: Any?,
topLevelObjects: AutoreleasingUnsafeMutablePointer<NSArray>?) -> Bool

因此您必须创建一个指针来获取返回时的 View 数组。

var topLevelObjects = NSArray()
if Bundle.main.loadNibNamed("CardView", owner: self, topLevelObjects: &topLevelObjects) {
let views = (topLevelObjects as Array).filter { $0 is NSView }
return views[0] as! NSView
}

编辑:我更新了答案以可靠地过滤 NSView 实例。

<小时/>

Swift 4 中,语法略有变化,使用 first(where 更有效:

var topLevelObjects : NSArray?
if Bundle.main.loadNibNamed(assistantNib, owner: self, topLevelObjects: &topLevelObjects) {
return topLevelObjects!.first(where: { $0 is NSView }) as? NSView
}

关于cocoa - Swift 3 加载 xib。 NSBundle.mainBundle().loadNibNamed 返回 Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570872/

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