Collection Controller 与子 Controller 之间的 iOS 通信

标签 ios swift delegation

我目前正在开发一个用 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/

相关文章:

ios - 界面生成器中的约束 "width equals height",对于同一 View : how to create such a constraint?

iphone - iPhone 和服务器上的 3DES 加密不同

ios - 如何根据电话号码过滤 quickblox 用户?

ios - 在 Swift 2.3 中关闭 UIAlertController 键盘

python - 在 Python 3 中创建自动委托(delegate)包装类

ios - 向 tableview Swift 添加新值

swift - 让 AR 视频适应背景

swift - 在 Firebase 注销时刷新 View Controller

ios - 为什么使用协议(protocol),而不是直接调用方法?

ios - 在 Swift 中使用协议(protocol)和委托(delegate)在两个类之间进行通信 - 不起作用,请参阅代码