返回 导航

Swift

hangge.com

Swift - 创建代理协议实现页面间参数传递和方法调用

作者:hangge | 2015-05-06 15:09
(本文代码已升级至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
评论

全部评论(5)

回到顶部