我目前正在开发一个用 Swift 编写的 iOS 应用程序,并构建了一个带有 UIPageViewController
和两个 subview Controller 的界面。
一切正常,但在某些时候我会触发PageViewController
来设置不同的 View Controller 。发生这种情况时,我想将数据从一个 child 传递给另一个 child 。
现在我知道最常被问到的 iOS 开发问题之一是如何在两个 UIViewController 之间传递数据,但我的情况非常具体,我找不到类似的问题。如果我错了,我将不胜感激。另外,我不仅仅是在寻找解决方案,因为我自己找到了一个解决方案。我正在寻找最好的一个,我知道这很难判断,但至少我正在寻找一个比我的更好的。
所以我想了一个办法,但我认为这不是很优雅。所以我通过代表交换数据。基本上,我通过委托(delegate)
将其从 subview Controller A 定向到 PageViewController
到 subview Controller B。
一切都很好,但我不知道这是否是最好的方法,或者是否还有其他更好的方法。
非常感谢您的帮助。
最佳答案
从所有角度来看,您所做的可能是最好的方法,但从正在使用的代码量来看。由于您的父级(页面 View Controller )负责所有工作,因此最好也传输它所需的所有数据。目前介于 2 个 View Controller 之间,以后可能介于 3 个 View Controller 之间。您也可以简单地更改这些 View Controller ,但保留用于检索数据的协议(protocol)。
但是这里有一个大问题。如果 View Controller 的数量会增加,那么您可能会发现自己遇到一个问题,即先前的 View Controller 被释放(如果这还没有发生),所以最后 View Controller 没有办法 D
访问 View Controller A
只是因为 A
不再存在。
class MyData {
var dataA: DataA?
var dataB: DataB?
var dataC: DataC?
}
现在页面 Controller 负责创建此类数据并将它们传递给将使用/修改数据的每个 View Controller 。所以在页面 View Controller 中:
var myData: MyData = MyData()
func prepareViewControllerA() {
let controller: ViewControllerA...
controller.myData = myData
...
}
现在每个 View Controller 都将拥有自己的属性来访问相同的数据对象并对其进行修改。您还可以向您的类添加委托(delegate),以便页面 Controller 可以监听其事件:
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)
}
}
现在您的页面 Controller 可以使用它了:
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)
}
关于Collection Controller 与子 Controller 之间的 iOS 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508901/