Swift - 创建代理协议实现页面间参数传递和方法调用
(本文代码已升级至Swift3)
下面通过一个样例来说明协议代理模式,功能如下:
1,主页面有一个标签和一个修改按钮,点击修改按钮会跳转到编辑页面
2,编辑页面中修改输入框的文字后,点击“确定”则返回主页面,同时主页面的标签值会替换成新值
3,如果点击编辑页面的“取消”按钮则直接返回主页面
效果图如下:



实现过程:
1,首先在storyboard中绘制如下两个界面,同时将主界面的“修改”按钮与编辑页做present modally关联

2,设置这个关联Segue的Identity为 EditView

3,主界面 ViewController.swift
import UIKit class ViewController: UIViewController,EditViewControllerDelegate{ @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } //页面跳转时 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "EditView"{ //通过seque的标识获得跳转目标 let controller = segue.destination as! EditViewController //设置代理 controller.delegate = self //将值传递给新页面 controller.oldInfo = label.text } } func editInfo(controller:EditViewController, newInfo:String){ label.text = newInfo; //关闭编辑页面 controller.presentingViewController!.dismiss(animated: true, completion: nil) } func editInfoDidCancer(controller:EditViewController){ //关闭编辑页面 controller.presentingViewController!.dismiss(animated: true, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
4,编辑页 EditViewController.swift
import UIKit class EditViewController: UIViewController { @IBOutlet weak var textField: UITextField! var delegate:EditViewControllerDelegate? var oldInfo:String? override func viewDidLoad() { super.viewDidLoad() if oldInfo != nil{ textField.text = oldInfo } } @IBAction func done(_ sender: AnyObject) { delegate?.editInfo(controller: self, newInfo: textField.text!) } @IBAction func cancel(_ sender: AnyObject) { delegate?.editInfoDidCancer(controller: self) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
5,编辑页代理 EditViewControllerDelegate.swift
protocol EditViewControllerDelegate{ func editInfo(controller:EditViewController, newInfo:String) func editInfoDidCancer(controller:EditViewController) }
6,在Storyboard中,将编辑页的Class设为EditViewController

7,源码下载:
hangge_717.zip

能给个demo吗,我写的老是出错
航哥,你这代理不用weak修饰不会造成循环引用的内存泄露吗?求告知
为什么一直报错Type "ViewController" does not conform to protocol "SecondViewControllerDelegate"
代理关系我也设置了,方法我也实现了啊,为什么会这样
设置这个关联Segue的Identity为 EditView
请问这里的设置 使用纯代码的方式应该如何 设置这个Identity
程序无法执行,点击确认或者Cancel时,delegate 都是nil,请问为什么?