一、視圖控制器間正向傳值
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)