《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.
}
/*
*/
}
3、闭包(Block)反向传值
// 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() {
*/
}
总结以上是内存溢出为你收集整理的《Swift 的界面之间的传值,详细介绍3种传值方式》 正向传值、协议传值、闭包全部内容,希望文章能够帮你解决《Swift 的界面之间的传值,详细介绍3种传值方式》 正向传值、协议传值、闭包所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)