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];