《Swift 的界面之间的传值,详细介绍3种传值方式》 正向传值、协
《Swift 的界面之间的传值,详细介绍3种传值方式》正向传值、协议传值、闭包
1、 控制器界面间的正向传值
/* 《Swift 的界面之间的传值,详细介绍3种传值方式》 正向传值、协议传值、闭包 */ 随着移动的开发,界面之间的传值,也频繁出现,更关键的是在面试的时候也时常被提起。提起最多的是 Block 同时还有协议 (在Swift中是叫 闭包)。我们要详细介绍它。 // Created by 周双建 on 15/12/7. // Copyright ? 2015年 周双建. All rights reserved. // import UIKit class ViewController: UIViewController { let Screen = CGSizeMake( 200,40) override func viewDidLoad() { super.viewDidLoad() // 我们首先,进行正面解说 //我们先给我们的本控制器设置一个标题 (必须实现导航控制器否者不显示) self.title = "第一个控制器" self.view.backgroundColor = UIColor.whiteColor() // 设置一个点击按钮,驱动事件跳转到下一个控制器 let Btn = UIButton(type: UIButtonType.Custom) as UIButton Btn.frame = CGRectMake(20, 100,Screen.width,Screen.height) Btn.setTitle("跳转到第二个控制器",forState: UIControlState.Normal) Btn.setTitleColor(UIColor.magentaColor(),forState: UIControlState.Normal) Btn.addTarget(self,action: "BtnClick",forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(Btn) // Do any additional setup after loading the view,typically from a nib. } /*****************************************************************/ // 按钮点击后,事件的触发 func BtnClick(){ //现获取,跳转的控制器对象 let TVC = TwoViewController() //传入一个字符串,给第二个控制器 TVC.TSTR = "第二个控制器" //在传入一个颜色对象 TVC.TColoer = UIColor.blueColor() //实现界面的跳转 self.navigationController?.pushViewController(TVC,animated: true)
} override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 第二个控制器的内容是:
// // TwoViewController.swift // Swift_009 // import UIKit class TwoViewController: UIViewController { //首先,我们要创建两个对象,来接受上一个界面传来的值 var TSTR :String? // 创建一个字符串对象 var TColoer :UIColor? //创建一个UIColoer 的颜色对象
override func viewDidLoad() { super.viewDidLoad() //设置控制器的标题 self.title = self.TSTR // 设置背景颜色 self.view.backgroundColor = self.TColoer // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { // Dispose of any resources that can be recreated. } } 2、 协议的反向传值
// FViewController.swift // import UIKit /* 注意了:如果不实现,你的定义的协议方法,会一直报错 。如下:Type 'FViewController' does not conform to protocol 'FTvCdelegte' 解决方法就是:实现你定义的协议方法 */ class FViewController: UIViewController,FTVCdelegte{ override func viewDidLoad() { super.viewDidLoad() //我们要创建一个返回按钮 let Fbtn = UIButton(type: UIButtonType.Custom) as UIButton Fbtn.frame = CGRectMake(30,self.view.frame.size.width-60,40) Fbtn.setTitle("跳转到第二个界面",forState: UIControlState.Normal) Fbtn.addTarget(self,action: "Click",forControlEvents: UIControlEvents.TouchUpInside) Fbtn.setTitleColor(UIColor.redColor(),forState: UIControlState.Normal) self.view.addSubview(Fbtn) // Do any additional setup after loading the view. } /****************************************************************/ //跳转触发事件 func Click(){ let Tvc = FtwoViewController() Tvc.delegate_zsj = self self.navigationController?.pushViewController(Tvc,animated: true) } override func didReceiveMemoryWarning() { // Dispose of any resources that can be recreated. } //实现协议的方法 //更改主题名字 func change(title: String) { self.title = title } //更改背景色 func ChangeColoer(Coloer: UIColor) { self.view.backgroundColor = Coloer } //是否成功 func ChangSucces(YON: Bool) { print(YON) } /* // MARK: - Navigation // In a storyboard-based application,you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ }
// FtwoViewController.swift // import UIKit //要创建一个协议 protocol FTVCdelegte : NSObjectProtocol{ //在协议里面,声明许多方法 // 第一个,改变标题 func change(title:String) //第二个,改变背景色 func ChangeColoer (Coloer:UIColor) //是否成功的标志 func ChangSucces(YON:Bool) } class FtwoViewController: UIViewController { // 创建一个准守协议的对象 var delegate_zsj :FTVCdelegte? override func viewDidLoad() { super.viewDidLoad() 返回上一个界面",forState: UIControlState.Normal) self.view.addSubview(Fbtn) /************************************************************/ //返回,事件的触发 func Click(){ delegate_zsj?.change("首页") delegate_zsj?.ChangeColoer(UIColor.redColor()) delegate_zsj?.ChangSucces(true) self.navigationController?.popToRootViewControllerAnimated(true) } override func didReceiveMemoryWarning() { // Dispose of any resources that can be recreated. }
/* */ }
// BBViewController.swift // import UIKit class BBViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //创建一个按钮 let btn = UIButton(type: UIButtonType.Custom) as UIButton btn.frame = CGRectMake(30,40) btn.setTitle("UIControlState.Normal) btn.setTitleColor(UIColor.magentaColor(),forState: UIControlState.Normal) btn.addTarget(self,forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(btn) // Do any additional setup after loading the view. } func Click(){ let BBTC = BBTViewController() BBTC.bbchange = { (title:String,coloer:UIColor) in self.title = title self.view.backgroundColor = coloer } self.navigationController?.pushViewController(BBTC,0)"> */ }
// BBTViewController.swift // import UIKit class BBTViewController: UIViewController { //定义一个闭包,带有两个参数 var bbchange :((title:String,coloer:UIColor)->Void)? override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.greenColor() //创建一个按钮 返回到第1个控制器",action: "bClick",forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(btn) // Do any additional setup after loading the view. } func bClick(){ bbchange?(title:"成龙",coloer:UIColor.redColor()) self.navigationController?.popToRootViewControllerAnimated(true)
} override func didReceiveMemoryWarning() { */ } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |