如何使用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的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSView 加载 Xib 文件

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

如何在swift中按下按钮从另一个xib文件加载另一个xib文件

Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

使用来自 XIB 的自定义 NSView/UIView 子类?

Interface Builder:如何从 nib 文件加载视图