从所有角度来看,您所做的可能是最好的方法,但正在使用的代码量除外。由于您的父级(页面视图控制器)负责所有工作,因此最好同时引导它需要的所有数据。目前介于 2 个视图控制器之间,以后可能介于 3 个之间。您也可以简单地更改这些视图控制器,但保留用于检索数据的协议。
但是这里有一个很大的问题。如果许多视图控制器会增长,那么您可能会发现自己遇到了一个问题,即之前的视图控制器正在被释放(如果这还没有发生),所以最后视图控制器D 无法访问视图控制器A 只是因为 A 不再存在。
这些事情的解决方案实际上取决于您的问题,但根据您的问题,我可以假设您正在将一些数据从一个视图控制器传递到另一个视图控制器,例如通过多个屏幕收集用户数据的入职培训。在这种情况下,最好有一个包含所有所需数据的类,例如:
class MyData {
var dataA: DataA?
var dataB: DataB?
var dataC: DataC?
}
现在页面控制器负责创建此类数据并将它们传递给将使用/修改数据的每个视图控制器。所以在页面视图控制器中:
var myData: MyData = MyData()
func prepareViewControllerA() {
let controller: ViewControllerA...
controller.myData = myData
...
}
现在每个视图控制器都有自己的属性来访问相同的数据对象并对其进行修改。您还可以向您的类添加一个委托,以便页面控制器可以监听其事件:
protocol MyDataDelegate: class {
func myData(_ sender: MyData, updatedA: DataA?)
func myData(_ sender: MyData, updatedB: DataB?)
func myData(_ sender: MyData, updatedC: DataC?)
func myDataAreFinalized(_ sender: MyData)
}
class MyData {
var dataA: DataA? {
didSet {
delegate?.myData(self, updatedA: dataA)
}
}
var dataB: DataB? {
didSet {
delegate?.myData(self, updatedB: dataB)
}
}
var dataC: DataC? {
didSet {
delegate?.myData(self, updatedC: dataC)
}
}
weak var delegate: MyDataDelegate?
func finalize() {
delegate?.myDataAreFinalized(self)
}
}
现在你的页面控制器可以使用它了:
var myData: MyData = {
let data = MyData()
data.delegate = self
return data
}()
和代表:
func myData(_ sender: MyData, updatedA: DataA?) {
}
func myData(_ sender: MyData, updatedB: DataB?) {
}
func myData(_ sender: MyData, updatedC: DataC?) {
}
func myDataAreFinalized(_ sender: MyData) {
dismiss(animated: true, completion: nil)
}