关于委托和视图控制器的简单问题

Simple Question about Delegate and View Controllers

我有 ViewContA (parent) 和 ViewContB(来自 ViewContA 的 child)

当用户数据改变时,ViewContA 从 firebase 监听, 所以我立即希望 ViewContB 更新数据。

我的代码

    protocol childVCDelegate {
        var user: User? { get set }
    }

    class ViewContA: UIViewController{
       
       var user: User?

       let VCB =  ViewContB()
       VCB.delegate = self

       //viewdidload
       loadUser()

       func loadUser(){
           // this function observe childChanged in realtime firebase
           UserService.shared.observeUser(uid: "XXX") { (user_updated) in
             // here update the user info in ViewContA but not in ViewContB
             self.user = user_updated
           }
       }

    }

    class ViewContB: UIViewController{
      
       var delegate: childVCDelegate
      
       var user: User?{
         delegate?.user
       }
       
       //viewdidload
       // USER IS ALWAYS THE SAME, NOT CHANGE WHEN FIREBASE FIRE loadUser in Parent
       print(user)

    }

非常感谢!

如果您想使用委托设计模式,以便在 Firebase 的用户列表更改时视图控制器 A 通知视图控制器 B,那么您应该让视图控制器 B 成为视图控制器 A 的委托。定义一个协议,我们称它为 UsersProtocol,它有一个方法 userHasChanged(_ user: User?)。当 firebase 完成处理程序触发时,调用方法:

protocol UsersProtocol {
    func userHasChanged(_ user: User?)
}


class ViewContA: UIViewController{

    var delegate: UsersProtocol? = nil

    func loadUser(){
           // this function observe childChanged in realtime firebase
           UserService.shared.observeUser(uid: "XXX") { (user_updated) in
             // here update the user info in ViewContA but not in ViewContB
             self.user = user_updated
             self.delegate?.userHasChanged(user_updated)
           }
       }
}

(请记住,您需要将 ViewContA 的委托设置为指向 ViewContB。)