Swift编程(二):UIViewController之间的传值以及闭包回调传值

Swift编程(二):UIViewController之间的传值以及闭包回调传值,第1张

概述知识背景: 在日程开放中页面传值是最为常见的,(具体动画特效见我的我的GitHub ) 效果图 学习目标: 学习闭包的使用 学习页面传值FirstViewController --> SecondViewController 通过闭包回调将值传回:SecondViewController --> FirstViewController 步骤 1. 创建两个UIViewController: LWR 知识背景: 在日程开放中页面传值是最为常见的,(具体动画特效见我的我的GitHub )
效果图 学习目标: 学习闭包的使用 学习页面传值FirstVIEwController --> SecondVIEwController 通过闭包回调将值传回:SecondVIEwController --> FirstVIEwController 步骤 1. 创建两个UIVIEwController:

LWRootVIEwController.swift 和 LWSecondVIEwController.swift
因为是Demo,我的布局就比较随意.一般两种方式(纯代码创建和storyboard)本次使用纯代码创建

2. LWRootVIEwController的具体代码 1. 创建组件,初始化,代码如下:
swift    var textFIElDWithTagOne: UITextFIEld?    var textFIElDWithTagTwo: UITextFIEld?    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        self.vIEw.backgroundcolor = UIcolor.whitecolor()        //通过tag获取控件        textFIElDWithTagOne = UITextFIEld(frame: CGRectMake(0,0,150,30))        textFIElDWithTagOne!.center = CGPoint(x: self.vIEw.center.x,y: 100)        textFIElDWithTagOne!.backgroundcolor = UIcolor.graycolor()        textFIElDWithTagOne!.tag = 1        textFIElDWithTagOne!.addTarget(self,action: "getValue:",forControlEvents: UIControlEvents.EditingDIDBegin)        self.vIEw.addSubvIEw(textFIElDWithTagOne!)        textFIElDWithTagTwo = UITextFIEld(frame: CGRectMake(0,30))        textFIElDWithTagTwo!.center = CGPoint(x: self.vIEw.center.x,y: 200)        textFIElDWithTagTwo!.backgroundcolor = UIcolor.graycolor()        textFIElDWithTagTwo!.tag = 2        textFIElDWithTagTwo!.addTarget(self,forControlEvents: UIControlEvents.EditingDIDBegin)        self.vIEw.addSubvIEw(textFIElDWithTagTwo!)    }
这里涉及了代码创建界面时的为何放在VIEwDIDLoad()中,其实这就要扯到 UIVIEwController的生命周期了。(我会在文章末尾出简单讲一下^__^) 2. 创建两个事件:
 swift//给两个textFIEld添加的点击事件,通过tag func getValue(sender: UITextFIEld) {        let tag = sender.tag        let second = LWSecondVIEwController()        second.initWithClosure(tag,dataList: ["我是选项1","我是选项2","我是选项3","我是选项4","我是选项5","我是选项6"],closuer: getValueClosure)        //页面跳转,从下往上        self.presentVIEwController(second,animated: true,completion: nil)    }    //闭包,在SecondVIEwController中回调传值的事件    func getValueClosure(tag: Int,string: String) {        let tf = self.vIEw.vIEwWithTag(tag) as! UITextFIEld        tf.text = string    }
3. LWSecondVIEwController.swift的具体代码:

在上一节,我已经详细讲解了如何代码创建UItableVIEw以及如何调用自定义UItableVIEwCell和自定义UItableCell的制作,这里我就不再一一赘述。

1. 变量声明跟初始化
swiftprivate let cellID = "DemoListID"    //声明一个闭包    private var myClosure: sendValueClosure?    private var mytag: Int?    private var dataList = [String]()    //下面的方法需要传入上个界面的someFunctionThatAClosure函数指针    func initWithClosure(tag: Int,dataList: [String],closuer: sendValueClosure?) {        //讲函数指针赋值给myClosure闭包,该闭包中覆盖了someFunctionThatTakesAClosure函数中的局部变量等引用        self.mytag = tag        self.dataList = dataList        self.myClosure = closuer    }    overrIDe init(nibname nibnameOrNil: String?,bundle nibBundleOrNil: NSBundle?) {        super.init(nibname: nibnameOrNil,bundle: nibBundleOrNil)    }    required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        self.vIEw.backgroundcolor = UIcolor.whitecolor()        let tableList = UItableVIEw(frame: CGRectMake(0,30,self.vIEw.frame.wIDth,self.vIEw.frame.height))        let nib = UINib(nibname: "DemoListCell",bundle: nil) //Cell文件名        tableList.registerNib(nib,forCellReuseIDentifIEr: cellID)        tableList.delegate = self        tableList.dataSource = self        tableList.reloadData()        self.vIEw.addSubvIEw(tableList)    }
2. 有UItableVIEw直接要写UItableVIEwDelegate和UItableVIEwDataSource的代理 今天告诉大家另外一种方式,使用扩展在LWSecondVIEwController的类的外面添加 在UItableVIEw的点击事件中调用闭包,将当前的Cell的值传递给回LWRootVIEwController
swiftextension LWSecondVIEwController: UItableVIEwDataSource {    func numberOfSectionsIntableVIEw(tableVIEw: UItableVIEw) -> Int {        return 1    }    func tableVIEw(tableVIEw: UItableVIEw,numberOfRowsInSection section: Int) -> Int {        return self.dataList.count    }    func tableVIEw(tableVIEw: UItableVIEw,cellForRowAtIndexPath indexPath: NSIndexPath) -> UItableVIEwCell {        let cell = tableVIEw.dequeueReusableCellWithIDentifIEr(self.cellID,forIndexPath: indexPath) as! DemoListCell        //cell.cellimg.image = UIImage(named: powerData[indexPath.row][2])        cell.cellLabel.text = self.dataList[indexPath.row]        return cell    }}extension LWSecondVIEwController: UItableVIEwDelegate {    func tableVIEw(tableVIEw: UItableVIEw,dIDSelectRowAtIndexPath indexPath: NSIndexPath)    {        let index = indexPath.row        let string = self.dataList[index]        if let closure = self.myClosure {            closure(tag: self.mytag!,string: string)        }        self.dismissVIEwControllerAnimated(true,completion: nil)    }}

ok!就是这么简单,回复让我知道 (^__^)

TIPS 添加事件小贴士 代码添加事件
swift item.addTarget(self,action: "click:",forControlEvents: UIControlEvents.touchUpInsIDe)
action: "funcname:" 和 action: Selector("funcname")的区别 第一种可以讲当前的item当做对象传递给事件:funcname(sender: AnyObject) 第二种不可以:funcname() 这里跟大家讲一下生命周期: vIEwDIDLoad 页面已经载入完毕,可以显示了 vIEwWillAppear 页面界面将要显示 vIEwDIDAppear 页面界面已经展示出来 vIEwWilldisappear 界面即将消失(可以做一下小动画在界面消失前) vIEwDIDdisAppear 界面消失不见,但还是在内存中 vIEwDIDUnload 界面已经从内存中释放出来 原文链接:http://www.jianshu.com/p/f5cc032e74f5 总结

以上是内存溢出为你收集整理的Swift编程(二):UIViewController之间的传值以及闭包回调传值全部内容,希望文章能够帮你解决Swift编程(二):UIViewController之间的传值以及闭包回调传值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1074089.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存