在帖子Using initWithNibName changes absolutely nothing中,他展示了对同一个View Nib定义的两种用法,在第一种情况下,他只调用alloc / init,第二种情况,他指定了initWithNibName。
所以,虽然这总是有效的:
MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:vctrlr animated:YES];
[vctrlr release];
以下适用于我继承的所有视图控制器,但不是我的!
TheirViewController *vctrlr = [[TheirViewController alloc] init];
[self.navigationController pushViewController:vctrlr animated:YES];
[vctrlr release];
iOS编程新手,我继承了一些代码。所有View Controllers的视图都在IB中定义,但这些视图控制器的分配/初始化创建不一致。我创建了一个新的View Controller和XIB,但它不起作用,除非我使用initWithNibName(当我将视图控制器推到Nav Controller上时崩溃)。我不知道我的视图控制器与其他控制器有什么不同...任何提示?我能够删除应用程序中除我的所有其他视图控制器的initNibName用法。
答案 0 :(得分:1)
您可以将任何字符串名称传递给initWithNibName:
。当您的班级被调用initWithNibName:@"MyClassName"
时,您不仅限于致电MyClassName
。它可能是initWithNibName:@"MyClassNameAlternateLayout"
。
如果您需要根据应用程序需要执行的操作加载不同的笔尖,这将非常有用。虽然我尽可能为每个设备类别(iPhone或iPad)设置每个视图控制器一个笔尖,以使开发和维护更简单,但我可以理解开发人员是否希望有时提供不同的布局或不同的功能。
另一个重点是initWithNibName:bundle:是UIViewController
的指定初始值设定项。当您致电-[[UIViewController alloc] init]
时,会在幕后调用initWithNibName:bundle:
。您可以使用符号断点来验证这一点。换句话说,如果您只是想要默认行为,那么您可以调用-[[UIViewController alloc] init]
并隐式调用指定的初始化程序。
但是,如果您正在调用-[[UIViewController alloc] init]
而未获得预期的行为,则可能是您的UIViewController子类未正确实现- (id)init
。实现应该看起来像这两个例子中的一个:
- (id)init
{
self = [super init];
if (self) {
// custom initialization
}
return self;
}
或
- (id)init
{
NSString *aNibName = @"WhateverYouWant";
NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want
self = [self initWithNibName:aNibName bundle:aBundle];
if (self) {
// custom initialization
}
return self;
}
答案 1 :(得分:0)
If you want to work following code:
MyViewController *vctrlr = [[MyViewController alloc] inil];
[self.navigationController pushViewController:vctrlr animated:YES];
Then you should implement following both methods in MyViewController:
- (id)init
{
self = [super initWithNibName:@"MyViewController" bundle:nil];
if (self != nil)
{
// Do initialization if needed
}
return self;
}
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
NSAssert(NO, @"Init with nib");
return nil;
}