天天看點

iOS基礎開發UI界面-xib基本使用

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