閉包傳值
閉包主要用于回調,這里我們還是模擬從詳情界面傳值到主界面,首先我們需要在詳情界面為閉包取個別名,聲明一個閉包類型,如下所示:
// 1、聲明閉包類型
typealias Closure=(String?)->Void
其次在詳情界面控制器中,聲明閉包屬性:
// 2、聲明閉包屬性
varclosure: Closure!
接下來,我們需要為詳情界面聲明一個閉包回調的方法,用于在主界面中調用,并且為閉包屬性賦值,如下所示:
// MARK:- closure send values methods
-// 3、閉包傳值調用方法
func callBack(closure: Closure!)
{
// 4、賦值閉包屬性
self.closure = closure
}
現在閉包屬性已經有值了,我們還需要在處理界面返回的方法中實現回調傳值的邏輯,同樣的,閉包類型為可選類型,我們可通過可選綁定判斷閉包屬性是否有值,如果有值,則通過閉包將需要傳遞到主界面的數據傳遞出去,代碼如下:
func respondsToBtn(sender:UIButton) {
//5、可選綁定:判斷closure屬性是否不為nil,如果不為nil,則通過closure將文本信息回調到調用closure方法所在的控制器中;
if?? let closure =self.closure {? ? ?
? closure(self.textField.text)?
? ? ? ? ? ? ? ? ? ? ? }
self.dismissViewControllerAnimated(true,completion:nil)
}
現在詳情界面已經配置完畢,最后一步,我們在主界面推送到詳情界面的方法中,通過實例化的詳情界面對象,調用閉包回調方法,然后打印數據即可,該方法在詳情界面返回到主界面的時候會直接被調用,代碼如下:
// MARK:- Events -func respondsToBtn(sender: UIButton) {letdetail_vc=DetailViewController()? ? detail_vc.callBack { (value:String?)->Voidinprint(value!)? ? }self.presentViewController(detail_vc, animated:true, completion: nil)}
Tips:
1、為閉包取別名,可在參數列表中將需要傳遞的參數寫成形參;
2、設置一個方法持有當前block;
3、在合適的地方進行調用類似于代理;
4、在創建該對象的地方進行閉包方面的調用;