闭包传值
闭包主要用于回调,这里我们还是模拟从详情界面传值到主界面,首先我们需要在详情界面为闭包取个别名,声明一个闭包类型,如下所示:
// 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、在创建该对象的地方进行闭包方面的调用;
网友评论