2013-08-04 2 views
1

я заметил, что при добавлении ViewController с интерфейсом строителем и пером,initWithNibName против INIT - неожиданное поведение

То, что я не должен позвонить initWithNibName для того, чтобы подобрать соответствующий наконечник, я могу просто позвонить в этом!

Любая идея, почему?

ie.

Это:

NotificationManagementController *notificationView = [[NotificationManagementController alloc] initWithNibName:@"NotificationManagementController" bundle:nil andCurrentNotifications:nil]; 

и Это:

NotificationManagementController *notificationView = [[NotificationManagementController alloc] init]; 

Оба кажутся взаимозаменяемыми ....

Таким образом, если я тогда называть эти строки кода:

notificationView.delegate = self; 
notificationView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentViewController:notificationView animated:YES completion:NULL]; 

Я вижу все изменения в наконечнике ,

+2

посмотрите на [документации] (http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/ Reference/Reference.html # // apple_ref/occ/instp/UIViewController/nibName): «Если вы не укажете имя nib и не переопределите метод loadView в своем пользовательском подклассе, контроллер просмотра будет искать файл nib, используя другие средства. В частности, он ищет файл nib с соответствующим именем (без расширения .nib) и загружает этот файл nib всякий раз, когда запрашивается его вид. (...) « – albertamg

ответ

2
NotificationManagementController *notificationView = [[NotificationManagementController alloc] initWithNibName:@"NotificationManagementController" bundle:nil andCurrentNotifications:nil]; 

просто не обязательно, и даже нахмурился некоторыми (включая меня).

NotificationManagementController *notificationView = [[NotificationManagementController alloc] init]; 

намного чище (и безопаснее), в который скрывает детали реализации, но будет эффективно назвать initWithNibName: за кулисами.

Мне нравится думать об этом так:

- (id)init 
{ 
    self = [[NotificationManagementController alloc] initWithNibName:@"NotificationManagementController" bundle:nil andCurrentNotifications:nil]; 
    if (self) 
    { 
     // Initialization 
    } 
    return self; 
} 
+0

звучит отлично! но что, если я хочу добавить дополнительные параметры ввода в мой метод init, initWithNibName является единственным, кто был открыт? Поэтому я расширял это, почему плохо звонить сNibName? – Woodstock

+2

[Потому что он разрушает инкапсуляцию] (http://oleb.net/blog/2012/01/initWithNibName-bundle-breaks-encapsulation/) – albertamg

+2

@JohnWoods Дополнительные входные параметры могут быть добавлены добавлением пользовательских 'init'methods в ваш VC , Не поймите меня неправильно, многие разработчики используют 'withNibName', я просто чувствую, что лучше использовать его один раз в другом методе' init'. Если бы вы, например, изменили имя Nib, то вызов 'withNibName' только один раз делает рефакторинг немного чистым :) – Cole

Смежные вопросы