什么时候应该使用initWithNibName初始化视图控制器?

什么时候应该使用init:什么时候应该使用initWithNibName:bundle:创build视图控制器时?

-initWithNibName:bundle:是UIViewController的指定初始值设定项。 有些东西最终应该叫它。 尽pipe如此,尽pipe苹果公司的例子(在许多情况下赞成简洁而不是可维护性),但绝不应该从视图控制器本身之外被调用。

你会经常看到这样的代码:

 MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil]; 

我说这是不正确的。 它将实现细节(NIB的名称和NIB甚至被使用的事实)放入调用者。 这打破封装。 正确的方法是:

 MYViewController *vc = [[MYViewController alloc] init]; 

然后,在MYViewController中:

 - (instancetype)init { self = [super initWithNibName:@"Myview" bundle:nil]; if (self != nil) { // Further initialization if needed } return self; } - (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { NSAssert(NO, @"Initialize with -init"); return nil; } 

这将关键的实现细节移回到对象中,并防止调用者意外地破坏封装。 现在,如果您更改NIB的名称,或者移动到编程构造,则将其修复在一个位置(在视图控制器中),而不是在每个使用视图控制器的位置。

使用initWithNibName,如果你是…用nib文件初始化! 也就是使用Interface Builder制作的文件。

如果你不使用IB来布置你的视图,你可以使用init。

只要xib具有与视图控制器类相同的名称,就可以调用init。 封装是没有必要的。 这样可以节省打字的时间,但是不能保证清晰

  NUDMainViewController *mainVC = [[NUDMainViewController alloc] init]; 

当没有nib / xib文件时使用init,例如UI是通过编码创build的

使用initWithNibName,如果我们有一个nib / xib或相同的控制器共享超过1个nib / xib

 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; } else { self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; } 

那就是我所想的..