Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIViewController: viewWillAppear is called, viewDidAppear not

In a UIViewController subclass, I have the following methods:

-(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;
}

The NIB has been created using Interface Builder. The corresponding view controller object is pushed by the navigation controller through pushViewController.

The inteded behavior is to show a default text entry in a text field, to select the entire text and to set the text field as first responder. [Edit: I've noticed that selecting all and making first responder makes no sense as the selection would dissapear; still, I wonder why the methods behave as described next.]

However, while methods viewDidLoad and viewWillAppear are called, the method viewDidAppear is not called. Can anybody tell me why? Most questions I found on the web and here deal with both viewWillAppear/viewDidAppear are not working; I also understood that in subviews or programmatically created views these methods are not evoked; but this does not apply in case and also I wonder why one of these "lifecycle" methods is evoked and the other not.

Any idea? Thanks!

like image 430
Sven Tiffe Avatar asked Dec 03 '10 13:12

Sven Tiffe


People also ask

Why viewWillAppear is not called?

The Simple Answer. The technical reason for when viewWillAppear gets called is simple. Notifies the view controller that its view is about to be added to a view hierarchy. It can't be any view hierarchy — it has to be the one with a UIWindow at the root (not necessarily the visible window).

What is called after viewDidAppear?

viewDidAppear is called once you see the loaded view on screen. It is called after view appeared.

Which is called first viewDidLoad or viewDidAppear?

viewDidLoad is called once when the controller is created and viewDidAppear is called each time the view, well, DID appear. So say you have a modal view that you present, when that view is dismissed, viewDidAppear will be called, and viewDidLoad will not be called.

What is viewDidAppear?

Notifies the view controller that its view was added to a view hierarchy. iOS 2.0+ iPadOS 2.0+ Mac Catalyst 13.0+ tvOS 9.0+


2 Answers

I had this issue happen to me: viewWillAppear was being called but viewDidAppear was not!

I finally figured out that this was because I had a tabBarController where I overloaded it's own viewDidAppear and forgot the [super viewDidAppear:animated];

It threw off every VC in every tab! adding that line back in fixed it for my other VC's.

Hope this helps someone!

like image 138
Andrew Soltan Avatar answered Oct 04 '22 21:10

Andrew Soltan


There is one case when viewWillAppear will be called but viewDidAppear will not.

Suppose you have two viewControllers and you push from the first to the second controller. Then, using the swipe, you want to go back to the first one, both controllers are displayed at the same time and at that moment viewWillAppear will be called from the first controller.

This way, you do not finish the swipe and stay on the second controller and viewDidAppear will not be called from the first controller.

like image 22
Sergey Shalnov Avatar answered Oct 04 '22 21:10

Sergey Shalnov