码迷,mamicode.com
首页 > 编程语言 > 详细

Swift 闭包传值

时间:2016-06-13 21:58:24      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

实现例子由两个界面组成

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)
    }
}

 

Swift 闭包传值

标签:

原文地址:http://www.cnblogs.com/zy-827/p/5582164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!