Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

что я думаю..