📜  从子控制器 swift 5 更新父 vc - Swift (1)

📅  最后修改于: 2023-12-03 15:06:34.734000             🧑  作者: Mango

从子控制器 Swift 5 更新父 VC

在 iOS 开发中,使用子控制器是很常见的。但是,有时子控制器需要将一些信息或事件传递给其父视图控制器。这时就需要使用委托或闭包等机制来实现。

委托模式

委托模式是一种常用的 iOS 设计模式,可以让对象之间进行通信。在委托模式下,通常会定义一个协议(Protocol),子控制器实现这个协议,并将自己作为委托来向父视图控制器传递信息。以下是一个使用委托模式的例子:

在父 VC 中定义协议
protocol MyDelegate: class {
    func didUpdateData(_ data: Any)
}

class ParentViewController: UIViewController {

    weak var delegate: MyDelegate?
    
    ...
}
在子 VC 中设置委托
class ChildViewController: UIViewController {

    var dataToUpdate: Any?
    var delegate: MyDelegate?
    
    ...
    
    func updateData() {
        // 更新数据
        delegate?.didUpdateData(dataToUpdate)
    }
}
闭包模式

闭包是一种可以在函数内部定义的匿名函数,可以在子控制器中使用闭包来完成信息的传递。以下是一个使用闭包模式的例子:

在子 VC 中定义闭包
class ChildViewController: UIViewController {

    var dataToUpdate: Any?
    var onUpdateData: ((_ data: Any) -> Void)?
    
    ...
    
    func updateData() {
        // 更新数据
        onUpdateData?(dataToUpdate)
    }
}
在父 VC 中设置闭包
class ParentViewController: UIViewController {

    ...
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "childVC" {
            let childVC = segue.destination as! ChildViewController
            childVC.onUpdateData = { data in
                // 处理更新数据
            }
        }
    }
}
总结

无论是使用委托模式还是闭包模式,都可以实现子控制器向父视图控制器传递信息或者事件。在实际项目中,需要根据具体情况选择最适合的方式来实现。