[[MyViewController alloc] initWithNibName:nil bundle:nil]; 搜索 Nib 文件的规则及注意事项

如果 

- initWithNibName:bundle:

的第一个参数, 即   nibName  指定为  nil并且没有重写  

- loadView

方法, 则 view controller 按下列顺序在 mainBundle 中 (因第二个参数  nibBundle 也指定为  nil) 搜索 NIB 文件: 

1. 先搜索 MyView.nib, 如果有, 就用它的内容初始化MyViewController 对象;

2. 如果没有搜到 MyView.nib, 就搜索 MyViewController.nib, 找到后就用它初始化 MyViewController 对象;

3. 如果还有找到, 就是说, 没有与该 view controller 关联 (associated) 的 NIB 文件, 并且因用户没有重写 - loadView  方法, 所以 - loadView  的默认实现就创建一个 plain UIView object, 并用它设定 view controller 的 view property.


[备注 1] 如果 - initWithNibName:bundle: 的参数 nibName 指定了 NIB 文件的名字, 但该 NIB 文件在参数 nibBundle 指定的 bundle 中找不到, App 将 Crash, 异常提示信息形如:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/Qi/Library/Application Support/iPhone Simulator/5.1/Applications/4AD1619B-1AA7-4E6D-B67A-18C2AA1A8494/testUIViewController.app> (loaded)' with name 'MyViewController''

[备注 2] - initWithNibName:bundle: 的参数 nibName 指定的 NIB 文件不是在该方法被调用时立刻加载的, 而是当 view controller 的 view 被访问时才首次被加载, 该初始化方法的调用是设定了:

@property(nonatomic, readonly, copy) NSString *nibName;

的值. 


[备注 3] 假如用户按下面三种情况重写 (override) 了 - loadView 方法: 

(1). 重写, 但不做任何事情: 

- (void)loadView
{
}

那么 无论在  - initWithNibName:bundle: 中 是否指定了有效的   nibName  名, view controller 的 view 都 没有被设定, 还是默认值   nil, 同时得到如下控制台打印信息 (设用  MyViewController 对象来设定 window 的 rootViewController): 

Application windows are expected to have a root view controller at the end of application launch

(2). 重写, 调用父类的方法 (注:  - loadView  的说明中提到: Your custom implementation of this method should not call  super. ).

- (void)loadView
{
    [super loadView];
}

那么, 如果在  - initWithNibName:bundle: 中指定了   nibName  为有效的 NIB 名, 就用该 NIB 中的 view 设置 view controller 的 view property; 如果指定了   nibName  为 nil, 则重写方法中父类的方法会创建一个   plain  UIView  object  来设定 view controller 的 view property

(3). 重写, 按需求重建用户自己的 view (hierarchy). 如:

- (void)loadView
{
    self.view = [[[UIViewalloc] initWithFrame:[[UIScreenmainScreen] applicationFrame]] autorelease];
    self.view.backgroundColor = [UIColor greenColor];
}

那么, 无论在  - initWithNibName:bundle: 中 是否指定了有效的   nibName  名, view controller 的 view 都是由   - loadView  方法中来设定, 而不去理会那个 NIB 文件中预设的 view. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值