我什么时候需要调用-[UIWiewController initWithNibName:bundle:]



在使用initWithNibName的帖子中,他展示了同一个View Nib定义的两种用法,第一种情况下,他只调用alloc/init,第二种情况下他指定initWithNib名称。

所以,虽然这总是有效的:

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编程新手,我继承了一些代码。所有视图控制器的视图都在IB中定义,但这些视图控制器的分配/init创建不一致。我创建了一个新的视图控制器和XIB,但除非我使用initWithNibName,否则它不会工作(当我将视图控制器推到Nav控制器上时,它会崩溃)。我无法判断我的视图控制器与其他视图控制器有何不同。。。有什么提示吗?我能够删除应用程序中除我之外的所有其他视图控制器的initNibName用法。

您可以将任何字符串名称传递给initWithNibName:。当您的类被称为MyClassName时,您不仅限于调用initWithNibName:@"MyClassName"。可能是CCD_ 6。

如果你需要根据应用程序的需要加载不同的笔尖,这会很有用。虽然我尽可能为每个设备类别(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;
}
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;
}

相关内容

  • 没有找到相关文章

最新更新