Swift 代理传值方式

协议传值

协议传值,主要用于代理模式。假设我们要实现从详情界面传值到主界面这一需求,首先,我们需要拟定一份协议,为了方便,我们可直接在详情界面中拟定协议,如下所示:

importUIKit//1、声明协议@objcprotocol DetailViewControllerDelegate {    optional func viewController(viewController: DetailViewController, dismissWithValue value: String)->Void}


@objc关键字标识该协议为一个可选协议;optional关键字标识该协议方法对于协议的遵守者而言不是必须实现的。

声明了协议之后,我们需要为详情界面声明一个代理属性,如下所示:

classDetailViewController:UIViewController{// 2、声明协议属性weakvardelegate: DetailViewControllerDelegate?overridefunc viewDidLoad() {    }}


代理属性delegate值为实现了DetailViewControllerDelegate协议的任意对象,weak关键字主要为了防止循环引用导致对象无法释放。

声明了代理属性之后,我们需要在处理界面跳转(返回)的方法中处理协议传值的逻辑了。首先我们需要判断代理人是否存在,可通过可选绑定来操作,如果代理存在,则让代理执行协议方法,并且将需要传递的信息通过参数传递给代理所在的界面,如下所示:

// MARK:- Events -func respondsToBtn(sender:UIButton) {// 3、判断代理是否存在,如果代理存在则让代理执行协议方法并且将数据传递给代理iflet delegate =self.delegate{        delegate.viewController!(self, dismissWithValue:"123")    }self.dismissViewControllerAnimated(true, completion:nil)}


现在万事具备,只缺“代理”了,切换到主界面中,在处理界面跳转的方法中,我们将详情界面的代理属性设为主界面,如下所示:

// MARK:- Events -func respondsToBtn(sender:UIButton) {    let detail_vc = DetailViewController()// 设置代理detail_vc.delegate=selfself.presentViewController(detail_vc, animated:true, completion:nil)}

然后,实现协议方法,在协议方法中,我们可以直接获取从详情界面传递过来的value值。

// MARK:- DetailViewControllerDelegate -func viewController(viewController: DetailViewController, dismissWithValuevalue: String) {    print(value)}

你可能感兴趣的:(Swift 代理传值方式)