【发布时间】:2022-02-20 22:05:18
【问题描述】:
我有这个方案:
- 家庭控制器
- 导航控制器
- Step1(NavigationController 的子级)
- Step2(NavigationController 的子级)
- 导航控制器
我的问题是我不知道如何将信息从父母传递给所有不同的孩子,因为当我将代表分配给孩子时,总是取最后一个。所以如果我打电话给委托,只有我添加的最后一个孩子会收到信息
一些基本代码:
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
}
}
*只打印“changed4”
我的问题:
如何使用一个委托(可能是数组?)向所有不同的孩子发送数据?有可能,属于好的做法吗?
谢谢!
【问题讨论】:
-
这和你在stackoverflow.com/questions/71162586/…问的一样。你接受了那个答案。你怎么又问了?
-
对于这种行为(多个对象可以看到数据更改),您应该通知中心:每次用户更改时都会发送通知。每个步骤都注册到此通知,因此可以在收到通知后进行纠正。此外,在您的情况下,您应该有一个 BasicStep 类女巫来处理这个,而类 stepx 将是它的子类。
-
是的,很抱歉再次询问,但一些逻辑已经改变。我该如何处理 BasicStep 类和 stepx 之类的子类。我认为这比在每个 stepX 上放置一个通知观察者要好。
-
如果我必须删除上一个问题,我没有问题,我是新手,无论您推荐什么,我都会做。谢谢
-
@nacho1111 - 您将
step1分配给.delegate... 然后将step2分配给.delegate... 等等。这相当于label.text = "A"后跟label.text = "B",然后想知道为什么标签文本不是“A”。作为旁注,您正在向后使用协议/委托模式......
标签: ios swift delegates protocols