您的位置:首页 > 其它

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

2012-07-31 21:40 357 查看
如果

- 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: