在Swift中从nib加载UIView

前端之家收集整理的这篇文章主要介绍了在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文件

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

猜你在找的Swift相关文章