swift开发之--代理协议的使用

swift代理的使用,和oc版本有区别,区别还是蛮大的,不过和oc一样都是用于反向传值:

实现如下:

1,声明两个类

2,实现流程,viewcontroller页面点击按钮进入firstVC页面,然后在firstVC页面修改值,返回把值传到viewcontroller页面

 

3,具体实现:

a 在firstVC页面声明代理

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    
    var delegate:EditViewControllerDelegate?
    
    var oldStr:String?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        if oldStr != nil {
            textField.text = oldStr
        }
        
    }
    @IBAction func sendAction(_ sender: Any) {
        delegate?.edidStr(controller: self, newInfo: textField.text!)
    }
    
    @IBAction func disMissAction(_ sender: Any) {
        delegate?.editStrDidCancel(controller: self)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

b 声明代理方法

protocol EditViewControllerDelegate {
    func edidStr(controller:FirstViewController,newInfo:String)
    func editStrDidCancel(controller:FirstViewController)
}

c 代理方法的使用

import UIKit

class ViewController: UIViewController,EditViewControllerDelegate {
    
    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    //页面跳转时
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "EditView"{
            let controller = segue.destination as! FirstViewController
            //设置代理
            controller.delegate = self
            //将值传递给新页面
            controller.oldStr = label.text
        }
    }
    
    func edidStr(controller: FirstViewController, newInfo: String) {
        label.text = newInfo;
        controller.presentingViewController?.dismiss(animated: true, completion: nil)
    }
    
    func editStrDidCancel(controller: FirstViewController) {
        controller.presentingViewController?.dismiss(animated: true, completion: nil)
    }

 

segue的设置:

 

 

 

 

 

posted @ 2018-07-21 17:59  稻草人11223  阅读(278)  评论(0编辑  收藏  举报
返回顶部