Swift 闭包(Closure)回调传值

这篇博客探讨了Swift中使用闭包进行回调传值的原理和步骤,通过实例展示了从界面B如何向界面A传递数据。闭包定义在A界面,B界面负责调用,以此实现数据的反向回传。文中提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现例子由两个界面组成
A - > B 使用属性传值
B - > A 使用闭包进行反向回调传值

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

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

至于定义闭包应该在哪个页面定义?

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

实现代码:

一级界面 A :

import UIKit

class ViewController: UIViewController {

    var textLab:UILabel?
    override func viewDidLoad() {
        super.viewDidLoad()
        //创建一个文本显示lab
        textLab = UILabel(frame:CGRectMake(80, 50, 120, 40));
        textLab?.backgroundColor = UIColor.yellowColor();
        textLab?.textAlignment = NSTextAlignment.Center;
        self.view.addSubview(textLab!);

        //创建一个按钮用于添加事件 A->B 属性传值
        var nextBtn = UIButton(frame: CGRectMake(80, 120, 120, 40))
        nextBtn.setTitle("下一页", forState: UIControlState.Normal);
        nextBtn.backgroundColor = UIColor.redColor();
        nextBtn.addTarget(self, action: "nextBtnAction", forControlEvents: UIControlEvents.TouchUpInside);
        self.view.addSubview(nextBtn);

    }
    //定义一个带字符串参数的闭包
    func myClosure(testStr:String)->Void{
        //给textLab 赋值
        //这句话什么时候执行?,闭包类似于oc中的block或者可以理解成c语言中函数,只有当被调用的时候里面的内容才会执行
        textLab?.text = testStr;
    }

    func nextBtnAction(){

        //获取目标页面对象
        var secondVC:SecondViewController = SecondViewController();
        //属性赋值
        secondVC.str = "属性传值"
        //将闭包传递到二级界面,在二级界面中调用
        secondVC.testClosure = myClosure;
        //模态视图跳转
        self .presentViewController(secondVC, animated: true, completion: nil);

    }

二级界面 B :

import UIKit

//类似于OC中的typedef
typealias sendValueClosure=(string:String)->Void

class SecondViewController: UIViewController {

    var str:String?
    //声明一个闭包
    var testClosure:sendValueClosure?

    override func viewDidLoad() {
        super.viewDidLoad()

        //创建一个文本显示lab
        var textLab = UILabel(frame:CGRectMake(80, 50, 120, 40));
        textLab.backgroundColor = UIColor.yellowColor();
        textLab.textAlignment = NSTextAlignment.Center;
        //给文本框赋值,这个值来自上一个界面
        textLab.text = str;
        self.view.addSubview(textLab);

        //创建一个按钮用于添加事件 B->A 闭包回调传值
        var backBtn = UIButton(frame: CGRectMake(80, 120, 120, 40))
        backBtn.setTitle("返回", forState: UIControlState.Normal);
        backBtn.backgroundColor = UIColor.redColor();
        backBtn.addTarget(self, action: "backBtnAction", forControlEvents: UIControlEvents.TouchUpInside);
        self.view.addSubview(backBtn);
    }

    func backBtnAction(){

        /**
        先判断闭包是否存在,然后再调用
        */
        if (testClosure != nil){
            testClosure!(string: "回调传值")
        }

        self .dismissViewControllerAnimated(true, completion: nil)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值