Когда я должен инициализировать controller представления с помощью initWithNibName?

Когда следует использовать init: и когда следует использовать initWithNibName:bundle: при создании controllerа представления?

-initWithNibName:bundle: назначенный инициализатор для UIViewController. Что-то должно в конечном итоге назвать это. Тем не менее, и, несмотря на примеры Apple (которые во многих случаях предпочитают краткость при ремонтопригодности), его никогда не следует вызывать из-за пределов самого controllerа.

Вы часто увидите такой код:

 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 или перейдете к программной конструкции, вы исправите его в одном месте (в controllerе представления), а не в каждом месте, где используется controller вида.

Используйте initWithNibName, если вы … инициализируетесь с помощью файла nib! То есть файл, созданный с помощью Interface Builder.

Если вы не используете IB для компоновки своих представлений, вы можете просто использовать init.

Вы можете просто вызвать init, если xib имеет то же имя, что и class controllerа вида. Инкапсуляция не требуется. Это позволяет печатать на машинке, но не может служить ясностью.

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

используя init, когда нет файла nib / xib, например, пользовательский интерфейс создается путем кодирования

используя initWithNibName, если у нас есть доля nib / xib или одного controllerа более чем на 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]; } 

вот что я думаю ..

  • Как подождать завершения асинхронного отправления?
  • Некоторые вопросы об автоматическом подсчете ссылок в iOS5 SDK
  • Как @synchronized блокировка / разблокировка в Objective-C?
  • Почему мы не можем использовать dispatch_sync в текущей очереди?
  • Как включить ARC для одного файла
  • Понимание побитового оператора AND
  • Что такое objc_setAssociatedObject () и в каких случаях его следует использовать?
  • Как объявить массив слабых ссылок в Swift?
  • @property сохранять, назначать, копировать, неатомически в Objective-C
  • Назначьте переменную внутри блока переменной переменной вне блока
  • Использовать веб-службу WCF с помощью Objective-C на iPhone
  • Давайте будем гением компьютера.