13

In my iOS app, I have a UITabBarController, and its viewControllers list looks like [vc1, vc2], which are of class MyVC1 and MyVC2 respectively, both of which subclass UIViewController. MyVC1 overrides viewWillAppear, and the overwritten version prints something so I know when it is called. (This is to isolate a larger problem I had, which was a view not appearing.)

My issue is that when the app first starts up and vc1 is the selected tab, nothing is printed, meaning its viewWillAppear is not being called. If I switch tabs and then go back to vc1, something does get printed, so vc1's viewWillAppear is not being called until I switch back to it from another tab.

Is there any way to have vc1 call viewWillAppear as soon as the app starts up, without needing to switch tabs? Honestly, I'm surprised this wasn't the default behavior already.

BallpointBen
  • 9,406
  • 1
  • 32
  • 62

4 Answers4

21

I just made a new test app in Xcode with nothing but a UITabViewController (and its two child view controllers) in Main.storyboard, and when I override viewWillAppear for the first child, my "view will appear" log prints every time (including on app launch).

Here are a couple things that could cause viewWillAppear to not be called:

  1. Not calling super somewhere you've overridden viewWillAppear
  2. Adding a view controller's view somewhere as a subview without adding the view controller as a child view controller

You also might try seeing if viewWillAppear is getting called for your UITabBarController, and if not, is it being called for its parent or presenting view controller? And so on until you find where the holdup is.

charmingToad
  • 1,597
  • 11
  • 18
  • 3
    Thanks, I overrode the `viewWillAppear` of `UITabBarController` without calling `super.viewWillAppear` inside. Stupid mistake... – BallpointBen Sep 12 '16 at 01:50
  • 1
    I Appreciate this answer. It's a very small thing and normally we miss it. It saved a lot of time. Thanks – Mitesh Khatri Sep 18 '21 at 11:05
4

if you have Custom UITabBarController, check override func viewWillAppear is call super

in Custom UITabBarController

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated) // this line need
    }
sdo
  • 71
  • 4
1

Use the following line in viewWillAppear method of your vc1:

  [super viewWillAppear:animated];

Next, the UITabBarController must be your initial controller.

KSR
  • 1,699
  • 15
  • 22
0

make shure in the UITabBarController in the viewwillapear have the super.viewWillAppear(animated) like the following code

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

    }