一、视图控制器间正向传值
1、正向传值有两种方式:第一种是通过属性传值,第二种是通过构造方法传值
2、通过属性传值:
let vc = ViewController()
vc.data = "通过dada属性传值"
self.present(vc, animated:true, completion:nil)
3、通过构造方法传值
// 在ViewController控制器中实现构造方法如下
init(data:String) {
self.data = data
super.init(nibName:nil, bundle:nil)
}
// 在要调用的地方调用ViewController控制器的构造方法实现数据传递
let vc = ViewController(data: "通过构造方法传值")
self.present(vc, animated: true,
completion: nil)
二、视图控制器间反向传值 (VC_1 向 VC_2传值为正向,VC_2 向 VC_1传值为反向)
1、控制器间反向传值要复杂一些,通常使用协议或者闭包完成
2、通过协议实现反向传值
// 在控制器VC_2中声明协议以及协议方法
protocol ViewControllerProtocol {
func sentData(data: String)
}
// 控制器VC_2
class ViewController: UIViewController {
// 声明一个Optional类型的代理属性
var delegate :ViewControllerProtocol?
}
// 在控制器VC_2需要反向传值的地方调用该方法进行协议传值,会在VC_1中的sentData方法中接受到此值
delegate?.sentData(data:"反向传值")
// 在控制器VC_1中遵守协议
class HomeVC:
UIViewController, ViewControllerProtocol
// 在控制器VC_1中需要跳转到VC_2的地方指定代理
let vc =ViewController()
vc.delegate =self
self.present(vc, animated:true, completion:nil)
// 在VC_1中实现协议方法
func sentData(data: String) {
// data 即为VC_1反向传递过来的值
}
3、通过闭包实现反向传值
// 在控制器VC_2中声明一个Optional值类型的闭包
var closure : ((String) ->Void)?
// 在控制器VC_2需要反向传值的地方调用此方法
self.closure!("反向传值")
// 在控制器VC_1中实现跳转到VC_2的方法,并实现反向传值的闭包,当VC_2需要跳转到VC_1并传值时,只需调用控制器VC_2中反向传值的方法即可
let vc = ViewController()
vc.closure = { (data: String) in
// data即为反向传过来的值
}
self.present(vc, animated: true,
completion: nil)
296

被折叠的 条评论
为什么被折叠?



