initWithNibName: что за пользовательская инициализация? - PullRequest
1 голос
/ 08 сентября 2011

edit: хорошо, я узнал, что вы можете выбирать между initWithNibName или initWithCoder, в зависимости от того, используете ли вы .xib или нет. И "init" просто не является методом конструктора для UIVIewController.

Это может показаться довольно простым вопросом, но я не уверен насчет ответа: я читал, что этот метод «используется только для программного создания контроллеров представления», и в документе: «Он загружен При первом обращении к представлению контроллера представления "

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}

Хорошо, чтобы понять это немного больше:

Что бы вы написали как "пользовательскую инициализацию" в этом методе?
Когда вы должны реализовать этот метод, как в коде, если вы можете просто написать его после выделения вашего viewController (пример: MyVC *myvc = [[MyVC alloc] initWithNibName:...bundle...];)

Спасибо за ваш ответ

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Обычно я делаю это:

// Initialize controller in the code with simple init
MyVC *myVC = [[MyVC alloc] init];

Тогда сделайте это по моему init методу:

- (id)init {
    self = [super initWithNibName:@"MyVC" bundle:nil];

    if (!self) return nil;

    // here I initialize instance variables like strings, arrays or dictionaries.

    return self;
}

Если контроллеру нужны некоторые параметры из initializee, тогда я пишу пользовательский initWithFoo:(Foo *)foo метод:

- (id)initWithFoo:(Foo *)foo {
    self = [super initWithNibName:@"MyVC" bundle:nil];

    if (!self) return nil;

    _foo = [foo retain];

    return self;
}

Это позволяет упростить инициализацию, а также дополнительные инициализаторы для вашего контроллера представления, если он может быть инициализирован из разных мест с разными параметрами. Затем в initWithFoo: и initWithBar вы просто вызываете init, который вызывает super и инициализирует переменные экземпляра значениями по умолчанию.

1 голос
/ 08 сентября 2011

Я обычно добавляю туда данные о конфигурации, которые, как я знаю, не изменятся.

Например, заголовок ViewController:

self.title = @"MyTitle";

Или, если это один из основных ViewController в TabBar приложении. То есть ему принадлежит одна из вкладок, тогда я настраиваю TabBarItem так:

UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"something" 
                     image:[UIImage imageNamed:@"something.png"] 
                       tag:0];

self.tabBarItem = item;

Там можно делать все, что угодно.

1 голос
/ 08 сентября 2011

Это метод init, поэтому вы инициализируете все, что вам нужно для инициализации, когда вы начинаете свою работу в вашем контроллере представления.Каждый объект ivar будет автоматически инициализирован на nil, но вы можете инициализировать NSMutableArray для работы или BOOL, для которого вы хотите иметь определенное значение.

Этот метод реализуется каждый раз, когда выесть что инициализировать, как указано ранее.Обычно вы не инициализируете вещи после выделения контроллера представления, поэтому вам не нужно делать это каждый раз, когда вы используете контроллер представления (так как вы можете использовать его в другом месте в вашем приложении).Это также лучшая практика.

...