'How to Delegate from Parent to Multiple Different Childs?

I have this scheme:

  • HomeController
    • NavigationController
      • Step1 (child of NavigationController)
      • Step2 (child of 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