我正在尝试从文件加载 NIB。
我有这个代码,来自 here
protocol NibLoadable {
static var nibName: String? { get }
static func createFromNib(in bundle: Bundle) -> Self?
}
extension NibLoadable where Self: NSView {
static var nibName: String? {
return String(describing: Self.self)
}
static func createFromNib(in bundle: Bundle = Bundle.main) -> Self? {
guard let nibName = nibName else { return nil }
var topLevelArray: NSArray? = nil
bundle.loadNibNamed(NSNib.Name(nibName), owner: self, topLevelObjects: &topLevelArray)
guard let results = topLevelArray else { return nil }
// let views = Array<Any>(results).filter { $0 is Self }
// return views.last as? Self
let element = results[0] as? Self
return results[0] as? Self
}
}
结果有两个元素,一个 NSView 和 NSApplication。
这里的问题是元素
为零。注释的代码也给了我 nil
。
我是 swift 的新手。这个 self 交付
是什么,或者它在createFromNib
最后一行代表什么?
最佳答案
不能保证第一个对象就是请求的 View 。
通过 first(where
并声明 nibName
是非可选的要求。
protocol NibLoadable {
static var nibName: String { get }
static func createFromNib(in bundle: Bundle) -> Self?
}
extension NibLoadable where Self: NSView {
static var nibName: String {
return String(describing: Self.self)
}
static func createFromNib(in bundle: Bundle = Bundle.main) -> Self? {
var topLevelArray: NSArray? // Optionals are nil by default
bundle.loadNibNamed(NSNib.Name(nibName), owner: self, topLevelObjects: &topLevelArray)
return topLevelArray?.first(where: { $0 is Self }) as? Self
}
}
关于ios - NSArray 包含两个元素,但 myArray[0] 为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56773345/