您的位置:首页 > 产品设计 > UI/UE

iOS基础开发UI界面-xib基本使用

2016-05-13 19:35 681 查看
XIB

在开发中,自定义View不一定要纯代码,还有另外的方式,就是创建xib.storyboard是从xib演化而来的,storyboard是描述整个软件界面,比较重量级,xib相对而言,是描述局部,比较轻量级.

A.加载xib的两种方式:

1.直接返回一个数组

NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];

2.返回一个nib对象,然后用nib的instantiteWithOwer方法,返回第一个数组

UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil];
//如果bundel作为参数, nil 默认是mainBundle
NSArray *array = [nib instantiteWithOwer:nil object:nil];


B.设置xib数据

设置xib数据的方法有很多,每种方法都可以设置到对应控件的值.只不过方法的区别在于哪一种方法更好用.

1.第一种方法:遍历所有的xib中所有的子控件

// 直接遍历子控件设置数据

for (UIView *view in shopView.subviews) {
if ([view isKindOfClass:[UIImageView class]]) {
UIImageView *imageView = (UIImageView *)view;
imageView.image = [UIImage imageNamed:shop.icon];
} else if ([view isKindOfClass:[UILabel class]]) {
UILabel *label = (UILabel *)view;
label.text = shop.name;
}
}


2.第二种方法:绑定子控件的tag值

// 通过tag拿到对应的子控件设置数据

UIImageView *iconImageView = (UIImageView *)[shopView                  viewWithTag:1];
iconImageView.image = [UIImage imageNamed:shop.icon];

UILabel *nameLabel = (UILabel *)[shopView viewWithTag:2];
nameLabel.text = shop.name;


3.第三种方法:自定义view封装管理xib

通过这方法可以更好的将内部实现的细节屏蔽,符合面向对象的三大特性.

a.先创建一个XXXShopView,xib和其文件名保持一致

b.把xib文件的类从UIView改成XXXShopView

c.拖线内部的子控件设置数据

d.重写模型的set方法

设置数据的三种思路:

1.在头文件中直接暴露子控件

2.提供方便的接口方便外界传数据

3.提供模型属性

d.提供内方法封装xib的加载过程

+ (instancetype)shopView
{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}

+ (instancetype)shopViewWithShop:(XXXShop *)shop
{
XXXShopView *shopView = [self shopView];
shopView.shop = shop;
return shopView;
}


C.xib注意点

如果通过xib或者storyboard创建的控件,初始化时时不会滴啊用initWithFrame,会调用initCoder,并且在初始化完毕之后会滴啊用awakeFromNib方法.如果要舒适化数据,一般选择重写awakeFromNib方法.

D.xib的加载原理

一般来说,xib是一层一层的解释转为对应的代码,如下:

- (void)loadXib
{
XXXShopView *shopView = [[XXXShopView alloc] initWithCoder:nil];
shopView.frame = CGRectMake(0, 0, 70, 90);
shopView.backgroundColor = [UIColor whiteColor];

UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil];
iconImageView.backgroundColor = [UIColor greenColor];
iconImageView.frame = CGRectMake(0, 0, 70, 70);
[shopView addSubview:iconImageView];
self.iconImageView = iconImageView;

XXXLabel *nameLabel = [[XXXLabel alloc] initWithCoder:nil];
nameLabel.backgroundColor = [UIColor greenColor];
nameLabel.frame = CGRectMake(0, 0, 70, 70);
[shopView addSubview:nameLabel];
self.nameLabel = nameLabel;


}

XIB控件是什么类型,加载出来就是什么类型,xib中的子控件是什么类型,拖线出来就是什么类型.需要注意的一点是,通过alloc/init或者alloc/initWihtFrmae创建控件不会主动加载xib,及时xib的名称和控件的类型一样.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: