How to reload a view controller when back from another view using tab bar

Bastien picture Bastien · Oct 5, 2017 · Viewed 12.1k times · Source

I have a common view used when the user opens the app (VC1). With a tab bar controller, I load another view (VC2) that can be used to update data visible in the previous one. When I go back on VC1 (which is stack), it does not reload with updated data.

I have tried to call the viewDidLoad in the viewWillAppear like so...

override func viewWillAppear(_ animated: Bool) {
    viewDidLoad()
}

It works, but it loads over the VC1 still on stack and the user can see the change (not good).

I suppose that to dismiss the VC1 would help, but I haven't found how to dismiss a view when using tab bar controller.

Answer

Krunal picture Krunal · Oct 5, 2017

Follow these steps to handle you view load setup every time your view will appear:
(VC1 = First View Controller)

  • Create a new function/method (named viewLoadSetup) in your VC1 and move all codes from viewDidLoad() to viewLoadSetup().
  • Now, Call viewLoadSetup() from viewWillAppear

    class VC1: UIViewController {
    
        override func viewDidLoad() {
           super.viewDidLoad()
           // viewLoadSetup()  you may call it from view did load also
        }
    
        override func viewWillAppear(_ animated: Bool) {
           super.viewWillAppear(animated)
           viewLoadSetup()
    
        }
    
    
         func viewLoadSetup(){
          // setup view did load here
         }
    
    
    }
    


If you want to call viewLoadSetup from viewDidLoad for one time, when your view controller is loaded, and then after every time from your viewWillAppear then,

class VC1: UIViewController {

    var isLoadingViewController = false

    override func viewDidLoad() {
        super.viewDidLoad()
        isLoadingViewController = true
        viewLoadSetup()
    }

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

        if isLoadingViewController {
            isLoadingViewController = false
        } else {
            viewLoadSetup()
         }
    }


    func viewLoadSetup(){
      // setup view did load here
    }


}