Метод инициализации iPhone UIViewController не вызывается - PullRequest
9 голосов
/ 21 апреля 2009

Я очень новичок в программировании iPhone и столкнулся с небольшим количеством странностей. Для следующего класса метод init никогда не вызывается - у меня есть функция NSLog, которая должна сообщать мне, когда выполняется init. Вот соответствующий код:

@interface MyViewController : UIViewController {
}
@end

@implementation MyViewController
- (id) init
{
    NSLog(@"init invoked");
    return self;
}
@end

Есть идеи о том, что я делаю неправильно - если что? Надеюсь, я предоставил достаточно информации.

Спасибо.

Ответы [ 5 ]

24 голосов
/ 20 февраля 2014

Если вы используете раскадровку, будет вызван initWithCoder:. Справочный документ гласит:

Если ваше приложение использует раскадровку для определения контроллера представления и его связанные представления, ваше приложение никогда не инициализирует объекты этого класса непосредственно. Вместо этого контроллеры представлений создаются раскадровка - либо автоматически с помощью iOS при запуске перехода, либо программно, когда ваше приложение вызывает объект раскадровки instantiateViewControllerWithIdentifier: метод. Когда создается экземпляр просмотр контроллера из раскадровки, iOS инициализирует новый вид контроллер, вызывая его initWithCoder: метод вместо этого. IOS автоматически устанавливает свойство nibName для файла пера, хранящегося внутри раскадровка.

Метод initWithCoder: не является частью шаблона по умолчанию для файла .m, поэтому вы должны добавить себя в свой подкласс UIViewController:

- (id)initWithCoder:(NSCoder *)aDecoder {

    self = [super initWithCoder:aDecoder];

    if (self) {
        // Custom initialization
        NSLog(@"Was called...");
    }

    return self;
}

Нет необходимости удалять initWithNibName:bundle: из вашего кода, но он все равно не будет вызываться.

22 голосов
/ 21 апреля 2009

Вы, вероятно, создаете свой контроллер представления из файла NIB. Таким образом, вместо того, чтобы вызывать сообщение «init», это одно сообщение создателя:

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

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

Удачи.

3 голосов
/ 21 апреля 2009

Представление подходит? Используйте эти методы для дополнительной инициализации:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //...
}

// Implement viewDidLoad to do additional setup after loading the view.
- (void)viewDidLoad {   
    [super viewDidLoad];
    //..
}
2 голосов
/ 09 сентября 2010

Но компонент UI иногда имеет несколько методов init *, нужно ли нам переопределять все эти методы для выполнения некоторого init. материал

1 голос
/ 24 января 2010

См. Также «назначенный инициализатор» в справочном документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...