gpt4 book ai didi

Collection Controller 与子 Controller 之间的 iOS 通信

转载 作者:行者123 更新时间:2023-11-30 11:38:14 26 4
gpt4 key购买 nike

我目前正在开发一个用 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 不再存在。

这些问题的解决方案实际上取决于什么,但从你的问题来看,我可以假设你正在将一些数据从一个 View Controller 传递到另一个 View Controller ,例如通过多个屏幕收集用户数据的登录。在这种情况下,最好有一个包含所需所有数据的类,例如:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com