美文网首页iOSiOS开发IOS XIB
两种加载Xib的实现方法

两种加载Xib的实现方法

作者: Zhang_yD | 来源:发表于2016-04-28 10:56 被阅读5154次

Warning:以下内容可能引起部分人群不适(部分人群:纯代码Coder),请在监护人陪同下观看。

Xib的可视化编程,带给诸如笔者这样打字慢,脑袋转速慢,代码看太多会头晕的人一个开发iOS的机会。
相比在大脑的思维殿堂搭建立体图形,在电脑上用肉眼可见的形式拖拽和堆叠的功能无疑会得到更多开发人员青睐。

以上是废话部分。

Xib加载,大致会有两种情形,代码调用和拖线调用。

我们在工程里面创建了一对文件叫SecView,这个文件有很多子控件,布局也很复杂,所以我们选择创一个同名的Xib来可视化编程。
创建完成的文件是这样的:

QQ20160428-0.png

拥有复杂控件的xib里面是这样的:


QQ20160428-1.png

当然,Xib里面具体有什么和我们今天要说的内容并没有关系。

我们要说的是,
如何让这个Xib正确加载到我们要加载的地方。

现在我们要把这个Xib放在ViewController里面,并让之正常显示。

方法一(代码调用):

1.导入类
#import "SecView.h"
2.创建一个属性
@property (nonatomic, weak) SecView *secView;
3.实例化这个属性,我这里使用的是懒加载的方式,当然也可以直接在ViewDidLoad或者init里面进行初始化。

- (SecView *)secView {
    if (!_secView) {
        SecView *secView = [SecView secView];
        [self.view addSubview:secView];
        _secView = secView;
    }
    return _secView;
}

4.设置Frame,如果你的ViewController也是Xib或者StoryBoard这样可视化控件初始化的,那建议把SecView的Frame设置放在- (void)viewDidLayoutSubviews;方法中。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.secView.frame = CGRectMake(0, 30, 100, 100);
}
Ps

在第3步中我使用了自定义的类方法[SecView secView]来初始化View,这个方法的实现部分是这样的。

+ (instancetype)secView {
    NSString *className = NSStringFromClass([self class]);
    UINib *nib = [UINib nibWithNibName:className bundle:nil];
    return [nib instantiateWithOwner:nil options:nil].firstObject;
}

类似这样的方法其实是通用的,抽到一个基类是不错的选择~

方法二(拖线调用):

我们在一个Xib中画了一个View,这个View是另一个Xib实现的,所以使用了绑定,效果如下。


QQ20160428-2.png

现在这个SecView也是用Xib实现的,为了正确显示,可以尝试一下步骤。
1.导入包,拖线创建属性(步骤略)
2.在SecView的Xib里面拖线,并绑定View的File`s Owner。

QQ20160428-3.png

要注意这里绑定的是Files Owner 而不是View。
3.在文件中创建一个View的属性。
其实就是对view拖线。

QQ20160428-4.png

4.重写- (instancetype)initWithCoder:(NSCoder *)aDecoder;方法代码细节长下面这个样子。
(xib初始化View必调方法)

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        
        [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
        [self addSubview:self.view];
    }
    return self;
}

5.重写- (void)layoutSubviews;方法,设置属性view的frame。

- (void)layoutSubviews {
    [super layoutSubviews];
    
    self.view.frame = self.bounds;
}
Ps:

2-5步都是对SecView的操作。而在装载他的ViewController中只需要拖线拖出一个属性,然后就可以对这个属性肆意揉弄了。


以上是两种Xib加载方式。是很简单,也是很基础的实现方式。
如果对这个两种方法有不同看法,欢迎在下方留言评论。
如果有更好的实现方案,也希望能写在下面~

相关文章

  • 两种加载Xib的实现方法

    Warning:以下内容可能引起部分人群不适(部分人群:纯代码Coder),请在监护人陪同下观看。 Xib的可视化...

  • 觅食邦 开发总结

    XIB 加载要点 通过xib加载view会调用- (void)awakeFromNib方法 xib加载view,点...

  • NSStringFromClass加载XIB

    两种加载xib的方法比较,优劣性显而易见。 方法一: [self.tableView registerNib:[U...

  • 04-UI基础第4天

    一、xib文件的加载过程 默认调用init方法后,自动调用initWithFrame方法 xib的加载不会调用in...

  • 加载控制器

    通过storyboard加载 通过加载xib的方式 loadView方法

  • 控制器加载底层原理和UI初始化过程

    1、带xib控制器加载过程 结果: 2、带xib文件,重写loadView方法。不会加载出来这个xib文件。如果不...

  • 等高Cell

    一、自定义Cell1、等高cell 代码 很古老的方法: 利用autoLayout xib加载xib要通过手动加载...

  • 优秀文章收集

    控件相关 iOS实现渐变背景色的三种方法ios开发中,xib加载view,loadNibNamed方法奔溃原因之一...

  • XIB的唤醒

    XIB的两种加载方式 方式一:NSArray*views = [[NSBundle mainBundle] loa...

  • UI-Xib

    Xib的加载 方法1 方法2 自定义控件view的步骤 新建自定义控件类 修改xib中view的类名 封装xib的...

网友评论

  • 8bad0e5aeda6:第二种方法没看懂,可以提供一下源码吗?
    夏天无泪灬:第二种方法应该补充下-(instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
    [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
    [self addSubview:self.view];
    }
    return self;
    }
    就完美了,vc就可以直接添加了
    Zhang_yD:其实就是绑定xib的属性方法而已....手边并没有实际的Demo...

本文标题:两种加载Xib的实现方法

本文链接:https://www.haomeiwen.com/subject/icsglttx.html