在Swift中从nib加载UIView

这里是我的Objective-C代码,我用来为我的自定义UIView加载一个nib:
-(id)init{

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
    return [subviewArray objectAtIndex:0];

}

Swift中的等效代码是什么?

Orignal解决方案

>我创建了一个XIB和一个名为SomeView的类(使用相同的名称
方便和可读性)。我基于UIView。
>在XIB中,我将“文件所有者”类更改为SomeView(在身份检查器中)。
>我在SomeView.swift中创建了一个UIView插件,将其链接到XIB文件中的顶级视图(为了方便起见称为“视图”)。然后我根据需要将其他插座添加到XIB文件中的其他控件。
>在SomeView.swift,我加载了XIB里面的“init与代码”初始值设定器。没有必要为“自我”指定任何东西。加载XIB后,所有插座都将连接,包括顶层视图。唯一缺少的是将顶视图添加到视图层次结构:

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加载自己。我可以使用SomeView作为一个类,当UIView可以在项目中使用(在界面构建器或编程)。

更新 – 使用Swift 3语法

在以下扩展中加载xib将被写为一个实例方法,然后可以像上面那样使用初始化器:

extension UIView {

    @discardableResult   // 1
    func fromNib<T : UIView>() -> T? {   // 2
        guard let view = Bundle.main.loadNibNamed(String(describing: type(of: self)),options: nil)?[0] as? T else {    // 3
            // xib not loaded,or it's top view is of the wrong type
            return nil
        }
        self.addSubview(view)     // 4
        view.translatesAutoresizingMaskIntoConstraints = false   // 5 
        view.layoutAttachAll(to: self)   // 6 
        return view   // 7
    }
}

>使用可废弃的返回值,因为当所有插座已经连接时,返回的视图对呼叫者几乎不感兴趣。
>这是一个返回类型为UIView的可选对象的通用方法。如果无法加载视图,则返回nil。
>尝试加载与当前类实例同名的XIB文件。如果失败,返回nil。
>将顶级视图添加到视图层次结构。
>此行假设我们使用约束来布局视图。
>此方法添加顶部,底部,前导&尾随约束 – 将视图附加到“self”的所有方面(不包括此方法的代码)。
>返回顶级视图

调用方法可能如下所示:

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())  // 4.
      fromNib()  // 6.
   }
   // other methods ...
}

> SomeClass是一个UIView子类,它从SomeClass.xib文件加载其内容。 “final”关键字是可选的。
>当在故事板中使用视图时的初始化器(记住使用SomeClass作为你的故事板视图的自定义类)。
>当以编程方式创建视图时(即:“let myView = SomeView()”)的初始化器。
>使用全零框架,因为此视图使用自动布局布局。
请注意,不是单独创建一个“init(frame:CGRect){..}”方法,因为自动布局专门在我们的项目中使用。
>& 6.使用扩展名加载xib文件。

信用:在这个解决方案中使用通用扩展是受到罗伯特的答案的启发下面。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...