
效果图 学习目标: 学习闭包的使用 学习页面传值FirstVIEwController --> SecondVIEwController 通过闭包回调将值传回:SecondVIEwController --> FirstVIEwController 步骤 1. 创建两个UIVIEwController:
LWRootVIEwController.swift 和 LWSecondVIEwController.swift
因为是Demo,我的布局就比较随意.一般两种方式(纯代码创建和storyboard)本次使用纯代码创建
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之间的传值以及闭包回调传值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)