-(id)init{ NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil]; return [subviewArray objectAtIndex:0]; }
Swift中的等效代码是什么?
>我创建了一个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文件。
信用:在这个解决方案中使用通用扩展是受到罗伯特的答案的启发下面。