iOS 创建控制器的几个初始化方法的调用情况
我们在创建控制器的时候总会碰上几个初始化方法,有时候也会被弄的晕头转向的。先说明一下以下几种创建方法:
1. storyboard 绑定:这种就是我们新建一个工程的时候的默认方法,即Main.storyboard 中绑定的 ViewController,我们在创建它的时候并未使用任何一行代码,除此之外在 storyboard 根据 segue 自动跳转也是这种情况。
2. instantiateViewControllerWithIdentifier:这种的话是在 storyboard 中新建了ViewController 控件,并且设置了它的标示 id,之后就可以在代码中使用该方法创建控制器。
3. loadNibNamed:这个方法既可以用来创建 ViewController,也可以创建UIView。
4. initWithNibName:这个也是比较常用的一个初始化方法,值得注意的是在调用控制器的 init 方法的时候会在 [super init] 中自动调用 initWithNibName:,方法的参数是该控制器类的类名字符串。
5. init(使用了xib),跟4是同一种,只是多了一步。
6. init(纯代码),这种指的是完全使用代码创建控制器,和 xib 还有故事板无关。
几注意点:
initWithCoder 是 nib loader 分配并初始化各个控件的时候由系统调用的,由于 xib 或者故事板中的控件加载顺序是不一定的,所以在 initWithCoder 中是无法获取到 outlet(即子视图子控件)的。
“When a nib is loaded, the nib loader allocates and initializes all objects, then hooks up all of their outlets and actions. Because of the order in which this happens, you cannot access outlets in your initializer. You can try, but they will all be nil.”
而 awakeFromNib 则是当所有的 outlet 和事件都创建并绑定之后由系统调用的,这是获取 outlet 并且赋予默认值的好地方。
“After all outlets and actions are connected, the nib loader sends awakeFromNib to every object in the nib. This is where you can access outlets to set up default values or do configuration in code. Example:”