这是我用来为我的自定义加载笔尖的 Objective-C 代码UIView:
UIView
-(id)init{ NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil]; return [subviewArray objectAtIndex:0]; }
Swift 中的等效代码是什么?
原始解决方案
.
class SomeView: UIView { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) NSBundle.mainBundle().loadNibNamed("SomeView", owner: self, options: nil) self.addSubview(self.view); // adding the top level view to the view hierarchy } ... }
请注意,这样我得到了一个从 nib 加载自身的类。然后,只要可以在项目中使用 UIView(在界面构建器中或以编程方式),我就可以使用 SomeView 作为类。
更新 - 使用 Swift 3 语法
在以下扩展中加载 xib 被编写为实例方法,然后可以由像上面的初始化程序使用:
extension UIView { @discardableResult // 1 func fromNib<T : UIView>() -> T? { // 2 guard let contentView = Bundle(for: type(of: self)).loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)?.first as? T else { // 3 // xib not loaded, or its top view is of the wrong type return nil } self.addSubview(contentView) // 4 contentView.translatesAutoresizingMaskIntoConstraints = false // 5 contentView.layoutAttachAll(to: self) // 6 return contentView // 7 } }
调用者方法可能如下所示:
final class SomeView: UIView { // 1. required init?(coder aDecoder: NSCoder) { // 2 - storyboard initializer super.init(coder: aDecoder) fromNib() // 5. } init() { // 3 - programmatic initializer super.init(frame: CGRect.zero) // 4. fromNib() // 6. } // other methods ... }
学分:在此解决方案中使用通用扩展的灵感来自 Robert 在下面的回答。
编辑 将“view”更改为“contentView”以避免混淆。还将数组下标更改为“.first”。