Swift 闭包传值

实现例子由两个界面组成

A  B 两个视图
A - > B 使用属性传值
B - > A 使用闭包进行反向回调传值

Swift 使用闭包传值的原理,与OC 中使用代码块(block)传值原理,基本类似

按步骤可以如下理解:
1、定义闭包。
2、闭包赋值(传送)
3、闭包调用。

想对于当前界面上执行某个操作,就在当前界面上定义,
比如:我想通过 B 界面回调 给 A 界面上的label赋值,赋值操作是在 A 界面上执行的、那么闭包就应该定义在 A 界面上。既然定义在 A ,那么 B 界面就是调用闭包的地方。找准实现者,跟调用者,然后在调用者界面定义属性用于接收闭包即可;

实现代码:

import UIKit

class ViewController: UIViewController {
    
    // 懒加载添加 btn
    lazy var btn:UIButton = {
        let button = UIButton(frame: CGRectMake(100, 200, 100, 30))
        button.backgroundColor = UIColor.redColor()
        button.addTarget(self, action: "btnAction:", forControlEvents: UIControlEvents.TouchUpInside)
        button.setTitle("点击跳转页面", forState: UIControlState.Normal)
        return button
    } ()

// 懒加载方法添加 label
    lazy var label:UILabel = {
        let lab = UILabel(frame: CGRectMake(100, 100, 100, 30))
        lab.backgroundColor = UIColor.yellowColor()
        return lab
    } ()
    
    // btn 实现方法
    func btnAction(btn:UIButton) {
        let secVC = SecViewController()

// 属性传值 赋值
        secVC.str = label.text
        
        // 接收传过来的值
        secVC.sendValue = {
            (str: String)-> () in
            self.label.text = str
        }
        // present 到 B 界面
        self.presentViewController(secVC, animated: true, completion: nil)
    }
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(btn)
        
        view.addSubview(label)
        
    }
}

import UIKit

class SecViewController: UIViewController {

// 属性传值 定义变量
    var str:String?

// 变量:类型  此处类型是个闭包
    var sendValue:((str:String)->())?
    
    // 懒加载添加 textfield
    lazy var textField:UITextField = {
        let tf = UITextField(frame: CGRectMake(100, 100, 100, 30))

// 属性传值 取值
        tf.text = self.str      
        tf.backgroundColor = UIColor.yellowColor()
        return tf
    } ()
    
    // 懒加载添加 btn
    lazy var button:UIButton = {
        let btn = UIButton(frame: CGRectMake(100, 200, 100, 30))
        btn.setTitle("back", forState: UIControlState.Normal)
        btn.addTarget(self, action: "back", forControlEvents: UIControlEvents.TouchUpInside)
        return btn
    } ()
    
    // btn实现方法
    func back() {
        // 调用
        if sendValue != nil {
           sendValue!(str: textField.text!)
        }       
        self.dismissViewControllerAnimated(true, completion: nil)
    }

override func viewDidLoad() {
        super.viewDidLoad()

view.addSubview(textField)
        
        view.addSubview(button)
    }
}

时间: 2024-10-19 02:51:29

Swift 闭包传值的相关文章

SWIFT语言实现代理传值/闭包传值

1.需求:利用代理实现反向传值(例子采用点击第二个视图控制器中的按钮来改变第一个视图控制器中的Label的内容) 一.第一个界面 1 class ViewController: UIViewController, ChangeTestLabelDelegate { 2 var testLabel: UILabel? 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after lo

swift开发使用闭包传值

swift开发使用闭包传值 开发中,从一个页面跳转到另一个页面的时候,有时候需要到跳转后的页面把值传回上一个页面,这里介绍一下swift开发中使用闭包传值 首先我们创建两个视图控制器分别为"ViewController"和"NextViewController" 现在我们要从"ViewController"跳转到到"NextViewController",然后在"NextViewController"里面把

Swift闭包(Closure)

语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "Alex", "Ewa", "Barry", "Daniella"] funcbackwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed =

SWIFt闭包

闭包的三种形式 1.全局函数是一个有名字但不会捕获任何值的闭包2.嵌套函数是一个有名字并且可以捕获其封闭函数域内值的闭包3.闭包表达式时一个利用轻量级语法缩写的可以捕获其上下文中变量或者常量值的没有名字的闭包 SWIFT闭包中的一些特点 1.利用上下文推断参数和返回值类型2.单表达式闭包可以省略return关键字3.参数名称简写4.Trailing闭包语法 闭包表达式 一般情况下我们采用如下方式使用sort 1 // Playground - noun: a place where people

swift闭包的另一种用法

这不是教程. 当你碰到函数参数需要传递一个闭包(closure)时,一般是可以直接这么传递的(假定无返回): // 教程一般教你在参数位置传递closure: someMethod(arg1, arg2, arg3: { args -> Void in //codes here }) // swift同时有一种“同步”的写法: someMethod(arg1, arg2){ args -> Void in //codes here } swift闭包的另一种用法

Swift学习(传值)

从前一页面向后一页面传值一般用到属性(比较简单的传值方式),当需要从后一页面向前传值时,我们一般想到的是代理和block,当然还有单例,今天我们就学习用Swift如何传值 我们从最简单的属性传值开始,使用了StoryBoard 第一个页面 class AddressBookViewController: UITableViewController<span style="color:#3333FF;">, InfoDelegate</span> { var ar

[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,

Swift 闭包(Closure)回调传值

实现例子由两个界面组成 A - > B 使用属性传值 B - > A 使用闭包进行反向回调传值 Swift 使用闭包(Closure)传值的原理,与OC 中使用代码块(block)传值原理,基本类似 按步骤可以如下理解: 1.定义闭包. 2.闭包赋值(传送) 3.闭包调用. 至于定义闭包应该在哪个页面定义? 想对于当前界面上执行某个操作,就在当前界面上定义, 比如:我想给通过 B 界面回调 给 A 界面上的文本框赋值,赋值操作是在 A 界面上执行的.那么闭包就应该定义在 A 界面上.既然定义在