xib和storyboard的對比
共同點
都是用來描述軟件界面
都用運用Interface Builder工具編輯
本質都是轉換成代碼去創建控件(控件都可以拖進去)
不同點
xib屬于輕量級的,只用用來展示界面
storyboard是重量級的,它是用來展示整個app的多個界面,并且可以設置界面之間的跳轉關系
xib的加載
// 方法1
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil]
// 方法2
UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
NSArray *views = [nib instantiateWithOwner:nil options:nil];
// 然后取出數組的lastObject
使用xib自定義的步驟
- 新建自定義控件類
73fed72c-d1a4-41f6-bf5a-e3f214d2fcd0.png
- 新建xib文件(文件名建議和自定義控件類名相同)
f333d723-937d-481a-b856-4074d878eda8.png
- 修改xib中calss類型,相當于指定給想對象的自定義控件
1fe47d50-2e9d-4579-b7d0-97deb6ebd7cc.png
- 封裝xib的加載過程
6e30c180-4ec7-47b5-9a94-309546d7507d.png
- 增加模型屬性,在模型屬性的setter方法中設置數據到控件上
91a8be0f-e213-4ae5-8396-7c5bdb167405.png
xib加載控制器
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 加載xib
FKViewController *rootView = [[FKViewController alloc] initWithNibName:@"FKViewController" bundle:nil];
self.window.rootViewController = rootView;
[self.window makeKeyAndVisible];
-
常見問題
0a54bd3f-9b24-4d17-85e9-527bdced1c64.png 解決方案:連線
把class類型修改
481131b6-c409-4d82-af15-6b378d27ca6b.png
- 連線
2e80bb14-b953-432d-a47f-06ab9e69458b.png
特殊情況
- 如果加載xib的代碼,設置為nil,即
FKViewController *fkView = [[FKViewController alloc] initWithNibName:nil bundle:nil];
// 或者
FKViewController *fkView = [[FKViewController alloc] init];
- 加載跟類名相同的xib
- 果描述控制器的view根控制器名相同,就會就加載
- 只有控制的int方法,底層會調用類名相同,就會去加載
- 只有控制器的init方法底層會調用initWithNibName:bundle:方法
只要通過initWithNibName:bundle:初始化控制器,并且nibName為nil,就會執行以下幾步(以FKViewController為例)
目前測試好像順序有點反,優先度 FKViewController > FKView
1.尋找有沒有跟控制器類名同名但是不帶Controller的xib,如果有就會去加載(FKView.xib)
2.尋找有沒有跟控制器類名同名的xib,如果有就會去加載(FKViewController.xib)
3.如果都沒有找到,創建空的view,
b43f5c4a-6b48-4ba2-83d8-0bbb205c760e.png