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,请问为什么?