UIViewController: viewWillAppear вызывается, viewDidAppear нет - PullRequest
16 голосов
/ 03 декабря 2010

В подклассе UIViewController у меня есть следующие методы:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // do something
    myTextField.text = @"Default";
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // do something
    [myTextField selectAll:self];
    [myTextField becomeFirstResponder];
}

- (void)viewDidLoad {
    [super viewDidLoad];    
    // do something
    myTextField.delegate = self;
}

NIB был создан с помощью Interface Builder. Соответствующий объект контроллера представления проталкивается контроллером навигации через pushViewController.

Предполагаемое поведение - показать текстовую запись по умолчанию в текстовом поле, выделить весь текст и установить текстовое поле в качестве первого респондента. [Редактировать: я заметил, что выделение всех и для первого респондента не имеет смысла, так как выбор исчезнет; Тем не менее, мне интересно, почему методы ведут себя так, как описано далее.]

Однако, при вызове методов viewDidLoad и viewWillAppear метод viewDidAppear не вызывается. Кто-нибудь может сказать мне, почему? Большинство вопросов, которые я нашел в Интернете и здесь касаются обоих viewWillAppear / viewDidAppear, не работают; Я также понял, что в подпредставлениях или программно созданных представлениях эти методы не вызываются; но это не относится к случаю, а также мне интересно, почему один из этих методов «жизненного цикла» вызывается, а другой нет.

Есть идеи? Спасибо!

Ответы [ 4 ]

22 голосов
/ 20 апреля 2014

У меня была эта проблема со мной: viewWillAppear вызывали, но viewDidAppear не было!

Я наконец понял, что это потому, что у меня было tabBarController, где я перегружал свою собственную viewDidAppear и забыл [super viewDidAppear:animated];

Скинул каждый VC в каждой вкладке!добавление этой строки обратно исправило ее для моего другого VC's.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 18 октября 2017

Это может быть потому, что вы добавили дочерний контроллер представления в родительский VC в viewDidLoad или viewWillAppear.Появление ребенка предотвращает звонок на viewDidAppear.

Это сумасшедшая вещь, и я знаю это только потому, что это была ошибка в моем коде.Я хотел добавить дочерний VC к этому VC, а не родительский VC.

0 голосов
/ 18 января 2017

У меня была такая же проблема.

Я скопировал / вставил viewDidAppear для создания viewWillAppear, но забыл изменить вызов super.viewDidAppear().Тогда это, казалось, перестало вызывать viewDidAppear.

Похоже, что где-то в вашем коде вы пропустили или перепутали вызов суперкласса.

0 голосов
/ 03 декабря 2010

Звонок на viewDidAppear: всегда должен следовать за viewWillAppear:, если вы не делаете что-то свое, чего, как вы говорите, вы не делаете.Я не знаю, почему это не работает, но вот несколько идей:

Может быть, вы делаете что-то странное в одном из методов делегата для UITextFieldDelegate?Маловероятно, что это повлияет на вызов viewDidAppear:, но это может быть причиной.

Вы загрузили много вещей в память, прежде чем открывать окно?Я не уверен, что произойдет, если вы получите предупреждение памяти между viewWillAppear: и viewDidAppear:.

Вы пытались сделать Чистку?Иногда это может помочь.

В подобных случаях, когда это должно работать, я обычно создаю новый класс и представляю функциональность по одному, чтобы посмотреть, смогу ли я заставить его работать таким образом.Я попробовал ваш код в новом проекте на основе навигации, где я добавил новый UIViewController с выходом в текстовое поле.Затем я вставил код из вопроса, и он работал как ожидалось.

...