如果
- 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.