在Swift中从nib加载UIView

在Swift中从nib加载UIView,第1张

概述这里是我的Objective-C代码,我用来为我的自定义UIView加载一个nib: -(id)init{ NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil]; return [subviewArray objectAtIndex:0];} S 这里是我的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中从nib加载UIView全部内容,希望文章能够帮你解决在Swift中从nib加载UIView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1060747.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存