什么时候需要调用-[UIViewController initWithNibName:bundle:]?

| 在使用initWithNibName绝对不变的文章中,他展示了相同的View Nib定义的两种用法,在第一种情况下,他简单地调用alloc / init,第二种情况下,他指定了initWithNibName。 因此,尽管这始终有效:
MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@\"MyViewController\" bundle:nil];
[self.navigationController pushViewController:vctrlr animated:YES];
[vctrlr release];
以下内容适用于我继承的所有View Controller,但不适用于我!
TheirViewController *vctrlr = [[TheirViewController alloc] init];
[self.navigationController pushViewController:vctrlr animated:YES];
[vctrlr release];
iOS编程的新手,我继承了一些代码。所有视图控制器的视图都在IB中定义,但是这些视图控制器的分配/初始化创建不一致。我创建了一个新的View Controller和XIB,但是除非使用initWithNibName,否则它将不起作用(将View Controller推入Nav Controller时会崩溃)。我不能说我的视图控制器与其他控制器有何不同...有什么提示吗?我能够删除应用程序中除我之外的所有其他视图控制器的initNibName用法。     
已邀请:
您可以将任何字符串名称传递给
initWithNibName:
。当您的班级称为
MyClassName
时,您不仅限于呼叫
initWithNibName:@\"MyClassName\"
。可能是5英镑。 如果您需要根据应用程序的需要加载其他笔尖,这将很有用。虽然我尝试尽可能使每个设备类别(iPhone或iPad)的每个视图控制器具有一个笔尖,以简化开发和维护工作,但我可以理解开发人员是否希望有时提供不同的布局或不同的功能。 另一个要点是initWithNibName:bundle:是
UIViewController
的指定初始化程序。当您呼叫
-[[UIViewController alloc] init]
时,便会在后台调用behind8ѭ。您可以使用符号断点进行验证。换句话说,如果仅希望使用默认行为,则可以调用
-[[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;
}
    
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;
}
    

要回复问题请先登录注册