Когда я должен инициализировать контроллер представления, используя initWithNibName? - PullRequest
48 голосов
/ 08 февраля 2010

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

Ответы [ 4 ]

137 голосов
/ 09 февраля 2010

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

Вы часто будете видеть код, подобный этому:

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

6 голосов
/ 08 февраля 2010

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

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

2 голосов
/ 24 июня 2014

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

 NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];
0 голосов
/ 02 сентября 2013

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

используя 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];
 }

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

...