Вы можете передать любое имя строки на initWithNibName:
.Вы не ограничены только вызовом initWithNibName:@"MyClassName"
, когда ваш класс называется MyClassName
.Это может быть initWithNibName:@"MyClassNameAlternateLayout"
.
. Это становится полезным, если вам нужно загрузить другое перо в зависимости от того, что приложение должно делать.Хотя я стараюсь по возможности использовать одно перо для каждого контроллера представления для каждой категории устройств (iPhone или iPad), чтобы упростить разработку и обслуживание, я мог понять, захочет ли разработчик иногда предоставлять другую компоновку или другую функциональность.
Другим важным моментом является то, что initWithNibName: bundle: является назначенным инициализатором для UIViewController
.Когда вы звоните -[[UIViewController alloc] init]
, то initWithNibName:bundle:
вызывается за кадром.Вы можете проверить это с помощью символической точки останова.Другими словами, если вы просто хотите поведение по умолчанию, ожидается, что вы можете вызвать -[[UIViewController alloc] init]
, и назначенный инициализатор будет вызван неявно.
Если, однако, вы вызываете -[[UIViewController alloc] init]
и не получаетеожидаемое поведение, вероятно, ваш подкласс UIViewController неправильно реализовал - (id)init
.Реализация должна выглядеть как один из этих двух примеров:
- (id)init
{
self = [super init];
if (self) {
// custom initialization
}
return self;
}
или
- (id)init
{
NSString *aNibName = @"WhateverYouWant";
NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want
self = [self initWithNibName:aNibName bundle:aBundle];
if (self) {
// custom initialization
}
return self;
}