Когда я должен инициализировать 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]; } 

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

  • @property сохранять, назначать, копировать, неатомически в Objective-C
  • Слабая переменная NSString не равна нулю после установки единственной сильной ссылки на nil
  • Как подождать завершения асинхронного отправления?
  • Основная HTTP-аутентификация на iPhone
  • Когда следует использовать enumerateObjectsUsingBlock vs. for
  • Не повторяющиеся случайные числа
  • Объективный-C-asynchronous веб-запрос с файлами cookie
  • Как работает пул автозаполнения NSAutoreleasePool?
  • Категории Objective-C в статической библиотеке
  • Что такое objc_setAssociatedObject () и в каких случаях его следует использовать?
  • Почему я не могу освободить объект?
  • Interesting Posts

    Шпилька в Linux

    Порядок событий «Form.Load», «Form.Shown» и «Form.Activated» в Windows Forms

    Почему мой компьютер отключается внезапно и без предупреждения?

    Как определить регистрацию пользователя в Windows XP?

    Как установить псевдоним в файле hosts?

    Internet Explorer 9, 10 и 11 Конструктор событий не работает

    Как я могу получить этот хороший индикатор строки в Outlook 2010 при ответе на электронные письма?

    Выбор данных между диапазоном даты / времени

    Компиляция с -static-libgcc -static-libstdc ++ по-прежнему приводит к динамической зависимости от libc.so

    Как отключить / настроить одно и то же имя и идентичную аутентификацию пароля между двумя ПК с Windows в одной сети?

    Поставщик «Microsoft.ACE.OLEDB.12.0» не зарегистрирован на локальном компьютере.

    C #: class для декодирования кодировки с кодовым кодированием?

    Каков наилучший способ сделать обратный цикл в C / C # / C ++?

    Как сделать снимок экрана в Windows 7 и автоматически создать файл скриншотов на рабочем столе, таком как Mac?

    как правильно реализовать Parcelable с ArrayList ?

    Давайте будем гением компьютера.