IOS 加载控制器的几种方法顺序

本文详细介绍了iOS中ViewController和View的加载过程,包括通过代码、XIB文件及Storyboard的不同加载方式及其方法调用顺序,并提供了加载自定义Xib时需要注意的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.对于ViewController的加载

  • Init加载ViewController:

代码创建的ViewController:

ViewControllerWith *vc = [[ViewControllerWith alloc]init];

在这个加载过程中 相关方法调用顺序是:
init
initWithNibName:bundle:
loadView
viewDidLoad

  • XIB加载ViewController:

当command+N创建ViewController的时候勾选了Also create XIB file ,系统就会帮我们创建与ViewController同名的XIB文件
对于这种控制器,常用的创建方式是:

ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]initWithNibName:@"ViewControllerWithXib" bundle:nil];

在这个加载过程中 相关方法调用顺序是:
initWithNibName:bundle:
loadView
viewDidLoad

当然, 你也可以以下这种方式创建带有XIB的ViewController
ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]init];

这样也能加载出你在xib里面创建的view
前提是你的控制器不能重写loadView方法
因为用这种方式创建 系统会调用loadVIew帮你寻找和类同名的XIB文件加载
你若是重写了loadVIew,那么控制器就是漆黑一片
这种方式和代码创建方式时,函数调用顺序一致

  • StoryBoard中加载ViewController:

在StoryBoard中构建好自己的控制器用以下代码初始化:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];//这里的bundle 写nil也可以代表是mainBundle
    MyViewController *vc = [self.storyboard  instantiateViewControllerWithIdentifier:@"MyViewController"];

在这个加载过程中 相关方法调用顺序是:
initWithCoder:
awakeFromNib
loadView(这个方法结束时 控制器的View的子控件才创建)
viewDidLoad


二. View的加载

  • Init加载View调用:

View加载的纯代码的方式:

MyView *view = [[MyView alloc]init];

view加赞完毕的时候
在这个加载过程中 相关方法调用顺序是:
init
initWithFrame:
是init调用了initWithFrame:

  • XIB加载View调用:

XIB加载方式:

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

解析一个文件的时候调用(只是创建了view)
在这个加载过程中 相关方法调用顺序是:
initWithCoder:(这个时候子控件没有被创建)
awakeFromNib(这个时候子控件创建完毕, 一般会在这里进一步对View进行初始化)


总结:
1.initWithNibName:bundle: (加载带有XIB控制器)
2.loadView (控制器的View为空的时候调用,帮控制器加载View)
3.initWithCoder: (是当从nib文件中加载对象的时候会调用)
4.awakeFromNib (当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
5.initWithFrame: (代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)

补充:
       [ ViewController initWithNibName:Bundle]   返回的是控制器
        加载自定义Xib注意设置:     
        1.   在空的Xib中添加的是View ; (关键)  
        2. 设置:在File's Owner 的Custom Class 中关联相关的控制器; 
        3. 设置:在View的show the connections inspector 的 Outlets 中将View属性拖拽到添加的View;(否则加载会奔溃) 
        4. 属于延时加载;         
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] 返回的是继承NSObject的数组;
       加载自定义Xib注意设置: 
        1. 在自定义的  Empty Xib  中 添加什么类型 本方法就会返回什么类型。(多用于自定义View)

        2. 设置:在File's Owner 的Custom Class 中关联相关的控制器;

        3. 设置:在View的show the connections inspector 的 Outlets 中将View属性拖拽到添加的View;(否则加载会奔溃) 



       // 起到四两拨千斤的效果

                         方法在视图跳转的时候被触发 , 注意条件:只适用于StoryBoard跳转

     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


      示例:参口示例

  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值