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的名稱和控件的類型一樣.