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

12,771

Solution 1

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
    }


}

Solution 2

You could use block in VC2 to call back VC1 to reload something.
First, in VC2, declare a block:

class View2Controller: UIViewController {

    public var completionHandler:(()->Void)?
    //...
}

Second, make callback in VC2 before going back:

self.completionHandler?()

Finally, in VC1, you are able to be called back to reload:

let vc2 = View2Controller()
vc2.completionHandler = { [weak self] () -> Void in
    //call reloading method like: self?.reloadData()
}
Share:
12,771

Related videos on Youtube

Bastien
Author by

Bastien

Updated on June 04, 2022

Comments

  • Bastien
    Bastien almost 2 years

    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.

  • Bastien
    Bastien over 6 years
    Thanks @Krunal, now the view is loading. But I still have the problem of the previous version of the VC1. When, in VC2, the user tap on the icon of the tab bar controller, the VC1 shows instantly and he can see old data and animation going over the previous version of VC1. Do you know how to dismiss the VC1 before reloading? I have tried ` self.presentedViewController?.dismiss(animated: true, completion: nil) ` without success. Thanks again.
  • Krunal
    Krunal over 6 years
    for animation going over the previous version of VC1. Do you know how to dismiss the VC1 before reloading? Use viewDidAppear for animation.
  • Krunal
    Krunal over 6 years
    for the previous version of the VC1. When, in VC2, the user tap on the icon of the tab bar controller, the VC1 shows instantly and he can see old data hide your view in viewWillAppear and again unhide upon data reload finish. Share your view controller code structure. so I can help you better