Swift 使用代理和闭包(closure)反向传值

FirstViewController的代码

import UIKit

class FirstViewController: UIViewController, SecondViewControllerDelegate {

    @IBOutlet weak var showTextLabel: UILabel!
    @IBOutlet weak var showDelegateTextLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    //点击按钮跳转到SecondViewController
    @IBAction func tapGoSecondViewController(sender: UIButton) {
        //从storyboard上加载SecondViewController
        let secondVC = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("secondViewController") as! SecondViewController
        //实现回调,获取回调回来的值 (闭包)
        secondVC.backClosure = {
            (backStr: String) -> Void in
            self.showTextLabel.text = backStr
        }
        secondVC.delegate = self
        //跳转到SecondViewController
        self.navigationController?.pushViewController(secondVC, animated: true)
    }
    //MARK: - SecondViewControllerDelegate(代理)
    func fetchBackString(str: String) {
        self.showDelegateTextLabel.text = str
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

SecondViewController的代码

import UIKit

//定义闭包类型(特定的函数类型函数类型)
typealias InputClosureType = (String) -> Void

protocol SecondViewControllerDelegate: NSObjectProtocol{
    func fetchBackString(str: String)
}

class SecondViewController: UIViewController {

    @IBOutlet weak var inputTextField: UITextField!
    //接收上个页面传过来的闭包块
    var backClosure: InputClosureType?
    weak var delegate: SecondViewControllerDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func tapBackButton(sender: UIButton) {
        if self.backClosure != nil {
            if let tempString = self.inputTextField.text {
                self.backClosure!(tempString)
            }
        }
        self.navigationController?.popViewControllerAnimated(true)
    }

    @IBAction func delegateBackMethod(sender: UIButton) {
        if self.delegate != nil {
            if let tempString = self.inputTextField.text {
                delegate!.fetchBackString("代理返回数据:\(tempString)")
            }
        }
        self.navigationController?.popViewControllerAnimated(true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

效果视图:

 

时间: 2024-10-12 12:52:10

Swift 使用代理和闭包(closure)反向传值的相关文章

使用Swift的代理,闭包来封装一个公用协议减少垃圾代码

iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题…… 比如说,我们先声网App中为了调用接口,做简单的判断,会有如下的垃圾代码(前辈遗留下来的): override func viewDidLoad() { super.viewDidLoad() var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1) sel

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

iOS 代理设计模式的应用——反向传值

设计一个代理模式需要六个步骤: 一.首先要先弄清楚谁是委托方,谁是代理方. a.委托方和代理方是不分开的,所以互相引用对方的头文件 二.委托方:声明一个委托协议 a.既然是委托协议,那就必须在委托方的类中声明.类似一个公告,既然是要让别人知道的,所以自然就是在.h文件中声明. b.只需声明要做的是什么,不需要告诉代理要怎么做.也就是说只要声明一个方法,不需要实现方法. 上代码: 三.委托方:声明一个委托代理属性 a.声明的作用就是给代理方提供一个接口拿到代理权,没有这个声明,就算能看到委托方的委

[ios][swift]使用swift闭包进行viewcontroller反向传值

闭包参考:http://c.biancheng.net/cpp/html/2285.html   闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值 import UIKit class ZWRootViewController: UIViewController { init(nibName nibNameOrNil: String?, bundle nibBundleO

Swift 闭包反向传值

Swift中闭包反向传值 1.第二控制器申明一个闭包类型 typealias BackBlock = (String) -> Void 2.第二控制器定义一个变量 var BackBlockClousure : BackBlock? 3.第一控制器实现回调 let VC = segue.destination as! DetailsViewController VC.BackBlockClousure = { (backStr:String) -> Void in NSLog(backStr,

OC10_代理反向传值

// // ProtectedDelegate.h // OC10_代理反向传值 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #import <Foundation/Foundation.h> @protocol ProtectedDelegate <NSObject> - (void)bark; @end // // D

【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个值传递给B类中得某个值(所以需要在B类中先准备一个变量来接受,就是用@property和@synthesize整个变量即可). (2)反向传值:比如需要把B类中的值传递给A类用.我们先在B类中写一个协议,协议里面有一个可以带参数的方法,这个参数就是我们要传递的值(这个协议也可以单独写,不一定写在B类中),然后B类遵循这个协议后,利用这个协议创建一个委托变

iOS 代理反向传值

在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用. 假如我们有一个需求如下:界面A上面有一个button.一个label.从界面A跳转到界面B,在界面B的输入框中输入字符串,在界面A的label上显示.这是一个典型的反向传值的例子.这个例子的核心是:"在界面B的输入框中输入字符串,在界面A的label上显示".也就是说:"界面B委托界面A显示字符串,页面A是界面B的代理".委托方向代理方反向传值. 那么我们该怎么用代理设

Swift中使用typealias定义一个闭包closure

在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这样的: typealias ZWProgressHUDCompletionBlock=()->Void 转载请注明!!!欢迎大家加入交流群:爱疯.爱Coding:209476515 Swift中使用typealias定义一个闭包closure,布布扣,bubuko.com