控制器的创建


创建控制器(UIStoryboard)

第一步:通过名字找到是哪个storyboard
//第一参数:名字
//第二个一般设置为nil就是默认的bundle。

  • (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;

第二步:通过storyboard的两个属性来加载storyboard数组中对应的storyboard
instantiateInitialViewController:指定加载有箭头指向的storyboard。
instantiateViewControllerWithIdentifier:指定加载设置了Storyboard ID的storyboard。

storyboard的类型:Custom Class的Class是什么类型就加载什么类型的。
注意:创建storyboard时,系统默认将控制器和view已经连线了。


---
#####创建控制器(xib)
>```
1、通过创建一个空的xib,拖一个view。
2、然后设置view的文件所有者File‘s Owner的Custom Class 的Class类型为一个控制器。
3、然后拖线File‘s Owner这个控制器的view为拖进去的view
通过控制器alloc后的
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil方法
来加载对应名字的的xib

创建控制器的view

通过上面方式的创建控制器后,在控制器中重写loadView来自定义view。
如果在loadView中调用super loadView,那么就是系统的默认做法。
一旦重写了这个方法,就不会去调用storyboard中的view了。
loadView什么时候调用:第一次控制器的view 的时候调用。
注意:在loadView中没有创建view就不能获取view,因为为空。并且没有创建view的时候,使用self来获取view时会造成死循环。

注意:当有多个控制器描述一个xib的时候
比如控制器为ViewController.h
有两个xib:ViewController.xib和View.xib
当方法的参数都为nil的时候:

  • (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
    默认会去加载和控制器同名的xib(ViewController.xib)。
    此时init方法也是同样的效果。
    因为init底层也是调用- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil方法。
    当参数都为nil时,也没有找到对应的xib时,会创建一个空的view。

总结
>```
控制器的view的加载,loadView方法实现了,就不会加载storyboard中的view了。
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
方法记得指定名字
当一个view的alpha为0时(透明),事件会穿透。
控制器的view的颜色默认是几乎透明。所以事件不能穿透。
当控制器的view是跟控制器的时候,不需要设置尺寸。
控制器的view的尺寸在viewDidLoad中打印是不准的,应该在viewDidAppear中才准确。
导航控制器上的内容位置不能由开发者决定,开发者只能决定尺寸。

你可能感兴趣的:(控制器的创建)