天天看點

Swift 視圖控制器間傳值(正向和反向)

一、視圖控制器間正向傳值

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)