如何使用Swift 3从Xib加载NSView
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Swift 3从Xib加载NSView相关的知识,希望对你有一定的参考价值。
如何从Xib正确加载NSView?
我的代码:
var topLevelArray: NSArray? = nil
let outputValue = AutoreleasingUnsafeMutablePointer<NSArray>(&topLevelArray)
if Bundle.main.loadNibNamed("RadioPlayerView", owner: nil, topLevelObjects: outputValue) {
let views = outputValue.pointee
return views.firstObject as! RadioPlayerView
}
topLevelArray = nil
return nil
问题是“outputValue”是一个自动释放指针,一旦我从函数返回,程序崩溃与ACCESS_BAD_ADDRESS
答案
我做了一个协议和扩展来做到这一点:
import Cocoa
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
}
}
用法:
final class MyView: NSView, NibLoadable {
// ...
}
//创建名为MyView.xib
的xib
// ... 别的地方:
let myView: MyView? = MyView.createFromNib()
以上是关于如何使用Swift 3从Xib加载NSView的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中按下按钮从另一个xib文件加载另一个xib文件
Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确