关于委托和视图控制器的简单问题
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。)
我有 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。)