'How to Delegate from Parent to Multiple Different Childs?
I have this scheme:
- HomeController
- NavigationController
- Step1 (child of NavigationController)
- Step2 (child of NavigationController)
- NavigationController
My problem is that i dont know how to pass info from Parent to all different childs, Because when i assign delegate to childs, always it take the last one. So if i call to delegate, only the last child that i have been added receive that the info
Some basic code:
class HomeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addSubview(showSteps)
}
@objc func showSteps() {
let controller = NavigationController()
self.present(controller, animated: true, completion: nil)
}
}
protocol UserProtocol: AnyObject {
func userHasChanged(_ user: User?)
}
class NavigationController: UIViewController {
var user: User?
weak var delegate: UserProtocol?
override func viewDidLoad() {
// all step childs are differents
let step1 = Step1()
addStep(step: step1)
delegate = step1
let step2 = Step2()
addStep(step: step2)
delegate = step2
let step3 = Step3()
addStep(step: step3)
delegate = step3
let step4 = Step4()
addStep(step: step4)
delegate = step4
}
func addStep(step: UIViewController){
self.addChild(step)
step.willMove(toParent: self)
view.addSubview(step.view)
step.didMove(toParent: self)
}
func userHasChanged(_ user: User?){
// this observe new user data from firebase
Service.shared.fetchUserData(uid: "XXX") { user in
self.user = user
// send new data to childs
// ONLY SEND TO CHILD4, (THE LAST ONE OBVIOUSLY)
self.delegate?.userHasChanged(user)
}
}
}
// that is a child example
class Step1: UIViewController, UserProtocol {
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
}
func tripHasChanged(_ new_user: User?) {
print("changed1")
self.user = new_user
}
}
class Step2: UIViewController, UserProtocol {
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
}
func tripHasChanged(_ new_user: User?) {
print("changed2")
self.user = new_user
}
}
class Step3: UIViewController, UserProtocol {
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
}
func tripHasChanged(_ new_user: User?) {
print("changed3")
self.user = new_user
}
}
class Step4: UIViewController, UserProtocol {
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
}
func tripHasChanged(_ new_user: User?) {
print("changed4")
self.user = new_user
}
}
*Only prints "changed4"
My question:
How can i do to send data to all different childs with one delegate (array maybe?)?. It is possible, Belongs to good practices?
Thanks!
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
