Reputation: 117
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.
Upvotes: 4
Views: 15068
Reputation: 79776
Follow these steps to handle you view load setup every time your view will appear:
(VC1 = First View Controller)
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
}
}
Upvotes: 11
Reputation: 6648
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()
}
Upvotes: 1