iOS xib的使用詳解


1.File’s Owner為nil

    UIView *demo1 = [[[NSBundle mainBundle] loadNibNamed:@"demo1" owner:nil options:nil] lastObject];

    CGRect rect = demo1.frame;

    rect.origin.y = 100;

    demo1.frame = rect;

    [self.view addSubview:demo1];

 

2.File’s Owner有值, File’s Owner可以是任何實例,不一定是控制器

  // 下面是demo2_class1.h, xib和demo2_class1連線產生的

  @property (weak, nonatomic) IBOutlet UIView *purpleView;

  @property (weak, nonatomic) IBOutlet UIView *blueView;

    // 下面是mainViewController.m

  demo2_class1 *demo2 = [[demo2_class1 alloc]init];

    NSLog(@"load前:demo2.purpleView.frame-------%@",NSStringFromCGRect(demo2.purpleView.frame));

    NSLog(@"load前:demo2.blueView.frame-------%@",NSStringFromCGRect(demo2.blueView.frame));

    // 此時self.view是沒值的,也就是說往self.view上加東西,是不會有效果的

    // [self.view addSubview:demo2.purpleView];

    [[[NSBundle mainBundle] loadNibNamed:@"demo2" owner:demo2 options:nil] lastObject];

    NSLog(@"load后:demo2.purpleView.frame-------%@",NSStringFromCGRect(demo2.purpleView.frame));

    NSLog(@"load后:demo2.blueView.frame-------%@",NSStringFromCGRect(demo2.blueView.frame));

    [self.view addSubview:demo2.purpleView];

說明:xib只有loadNib完之后,File’s Owner的IBOutlet才會自動初始化

 

3.  如果在<2>的代碼的基礎上,新建一個dog類,把Owner改成dog,其他都不改

  Dog *dog = [[Dog alloc]init];

    [[[NSBundle mainBundle] loadNibNamed:@"demo2" owner:dog options:nil] lastObject];

運行程序,程序崩潰,崩潰原因如下,由此可見,在loadNibNamed時,會去找owner的IBOutlet,並對IBOutlet做setValue的操作

2015-02-03 14:49:17.285 xib開發[31342:60b] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Dog 0x8d4bc90> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key blueView.'

 

4.如果在<2>的代碼的基礎上,給demo2_classs1這個類添加實例方法 - (IBAction)clickMe;並且在xib上添加個按鈕,按鈕和clickMe做連線

在模擬器上點擊那個按鈕,有打印.

 

5.xib里的view指定為自定義的類.  PS:File’s Owner不用去設

--------------------------------------------------分割線--------------------------------------------------

5.1 Demo3 class一般是自定義類,需要提供一個遍歷構造方法,方便使用

+ (instancetype)initWithXib{

    return [[[NSBundle mainBundle] loadNibNamed:@"demo3" owner:nil options:nil] lastObject];

}

5.2 補充:如果需要對xib里各個子控件做個性化的設置,可以在awakeFromNib做相應設置

- (void)awakeFromNib{

    self.backgroundColor = [UIColor redColor];

}

5.3 在mainViewController.m里使用xib

    demo3_class *demo3 = [demo3_class initWithXib];

    CGRect rect = demo3.frame;

    rect.origin.y = 200;

    demo3.frame = rect;

    [self.view addSubview:demo3];

 

6.xib的File’s Owner是UIViewController的子類,File’s Owner的view 就是xib的view

// 提供便捷方法

+ (instancetype)viewControllerFromXib{

    return [[self alloc] initWithNibName:@"demo4" bundle:nil];

}

看看MainViewController怎么使用:

  // 穩妥的做法

  demo4_ViewController *demo4VC = [[demo4_ViewController alloc]initWithNibName:@"demo4" bundle:nil];

  // 或者用便捷方法,如果xib文件的名字和類名稱一樣,可以用便捷方法

  // demo4_ViewController *demo4VC = [demo4_ViewController demo4ViewController];

    [self.view addSubview:demo4VC.view];

  // 父子控制器

  [self addChildViewController:demo4VC];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM