在创建视图控制器时,什么时候应该使用init:,什么时候应该使用initWithNibName:bundle:

推荐答案

-initWithNibName:bundle:是UIViewController的指定初始值设定项.最终应该有人会这样称呼它.也就是说,尽管苹果的例子(在许多情况下主张简洁而不是可维护性),但它永远不应该从视图控制器本身之外调用.

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

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

我说这是不正确的.它将实现细节(NIB的名称以及甚至使用了NIB的事实)放入调用者.这 destruct 了封装.正确的方法是:

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;
}

这会将关键实现细节移回对象中,并防止调用方意外 destruct 封装.现在,如果更改NIB的名称,或者转到编程构造,则可以在一个位置(在视图控制器中)修复它,而不是在使用视图控制器的每个位置.

Objective-c相关问答推荐

MKMapView 上的 UIPanGestureRecognizer?

Objective-C 中的实例变量是否默认设置为 nil?

iphone 的 UIPopoverController 不工作?

是否可以将 NSInteger 转换为 NSNumber?

在 NSData 和 base64 字符串之间转换

滚动 NSScrollView 时的回调?

在 iOS 设备上本地存储图像

指向方法返回类型的Expected a type错误

了解 performSegueWithIdentifier

如何删除手势识别器

NSManagedObjectContext:异常断点在 save: 方法处停止,但没有日志(log)/崩溃/错误

如何制作真正的私有实例变量?

如何在 Cocoa 中获取 NSArray 的第一个 x 元素?

如何从设置屏幕打开位置服务屏幕?

iOS是静态框架还是动态框架?

UIDatePicker 中的最小和最大日期

iOS 7 中的 UITextView 链接检测

根据文本量更改 UITableViewCell 高度

带有Go按钮而不是返回的 iOS 键盘

判断 UIViewController 是否即将从导航堆栈中弹出?