SWIFT语言实现代理传值/闭包传值

1.需求:利用代理实现反向传值(例子采用点击第二个视图控制器中的按钮来改变第一个视图控制器中的Label的内容)

一、第一个界面

 1 class ViewController: UIViewController, ChangeTestLabelDelegate {
 2     var testLabel: UILabel?
 3     override func viewDidLoad() {
 4         super.viewDidLoad()
 5         // Do any additional setup after loading the view, typically from a nib.
 6         self.title = "swift代理传值";
 7         let rightButtonItem: UIBarButtonItem = UIBarButtonItem(title: "下一页", style: .Plain, target: self, action: "nextPage");
 8         self.navigationItem.rightBarButtonItem = rightButtonItem;
 9
10         testLabel = UILabel(frame: CGRectMake(0, 200, 320, 50));
11         testLabel?.layer.borderColor = UIColor.redColor().CGColor;
12         testLabel?.layer.borderWidth = 1;
13         testLabel?.layer.cornerRadius = 5;
14         testLabel?.text = "学雨燕";
15         testLabel?.textAlignment = NSTextAlignment.Center;
16         self.view.addSubview(testLabel!);
17     }
18
19     func nextPage() {
20         let secondVC: SecondViewController = SecondViewController();
21         secondVC.delegate = self;
22         self.navigationController?.pushViewController(secondVC, animated: true);
23     }
24
25     func changeLabelText(controller: SecondViewController, string: String) {
26         testLabel?.text = string;
27         println("testLabel.text == \(string)");
28     }
29     override func didReceiveMemoryWarning() {
30         super.didReceiveMemoryWarning()
31         // Dispose of any resources that can be recreated.
32     }
33
34
35 }

二、第二个界面

 1 import Foundation
 2 import UIKit
 3
 4 //定义协议改变Label内容
 5 protocol ChangeTestLabelDelegate: NSObjectProtocol {
 6     //回调方法
 7     func changeLabelText(controller: SecondViewController, string: String);
 8 }
 9
10 class SecondViewController: UIViewController {
11     var temp = 0;
12     var delegate: ChangeTestLabelDelegate?
13     override func viewDidLoad(){
14         super.viewDidLoad()
15         self.title = "SecondViewController";
16         self.view.backgroundColor = UIColor.yellowColor();
17         let rect = CGRect(x:50,y:200,width:150,height:50);
18         var myButton = UIButton(frame:rect);
19         myButton.center = CGPointMake(160,200);
20         myButton.setTitle("改变Label内容",forState:.Normal);
21         myButton.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal);
22         myButton.addTarget(self,action:"btnClicked",forControlEvents:.TouchUpInside);
23         self.view.addSubview(myButton);
24
25     }
26     func btnClicked(){
27         temp++;
28         println("我被点击了\(temp)次.")
29         if(delegate != nil) {
30             delegate?.changeLabelText(self, string: "学雨燕" + "\(temp)");
31         }
32     }
33 }

2.需求:利用闭包实现反向传值

 1 import UIKit
 2
 3 class ViewController: UIViewController {
 4     var testLabel: UILabel?
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7         // Do any additional setup after loading the view, typically from a nib.
 8         self.title = "swift闭包传值";
 9         let rightButtonItem: UIBarButtonItem = UIBarButtonItem(title: "下一页", style: .Plain, target: self, action: "nextPage");
10         self.navigationItem.rightBarButtonItem = rightButtonItem;
11
12         testLabel = UILabel(frame: CGRectMake(0, 200, 320, 50));
13         testLabel?.layer.borderColor = UIColor.redColor().CGColor;
14         testLabel?.layer.borderWidth = 1;
15         testLabel?.layer.cornerRadius = 5;
16         testLabel?.text = "swift闭包";
17         testLabel?.textAlignment = NSTextAlignment.Center;
18         self.view.addSubview(testLabel!);
19     }
20
21     func nextPage() {
22         let secondVC: SecondViewController = SecondViewController();
23         secondVC.initWithClosure(someFunctionThatTakesAClosure);
24         self.navigationController?.pushViewController(secondVC, animated: true);
25     }
26     func someFunctionThatTakesAClosure(string:String) -> Void {
27         testLabel!.text = string
28     }
29     override func didReceiveMemoryWarning() {
30         super.didReceiveMemoryWarning()
31         // Dispose of any resources that can be recreated.
32     }
33
34
35 }
 1 import Foundation
 2 import UIKit
 3 //类似于OC中的typedef
 4 typealias changeLabelTextClosure = (string:String) -> Void;
 5
 6 class SecondViewController: UIViewController {
 7     var myClosure: changeLabelTextClosure?   //声明一个闭包
 8     var temp = 0;
 9     func initWithClosure(closure: changeLabelTextClosure?) {
10         myClosure = closure; //将函数指针赋值给myClosure闭包,该闭包中涵盖了someFunctionThatTakesAClosure函数中的局部变量等的引用
11     }
12     override func viewDidLoad(){
13         super.viewDidLoad()
14         self.title = "SecondViewController";
15         self.view.backgroundColor = UIColor.yellowColor();
16         let rect = CGRect(x:50,y:200,width:150,height:50);
17         var myButton = UIButton(frame:rect);
18         myButton.center = CGPointMake(160,200);
19         myButton.setTitle("改变Label内容",forState:.Normal);
20         myButton.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal);
21         myButton.addTarget(self,action:"btnClicked",forControlEvents:.TouchUpInside);
22         self.view.addSubview(myButton);
23
24     }
25     func btnClicked(){
26         temp++;
27         println("我被点击了\(temp)次.")
28             if (myClosure != nil){
29                 //闭包隐式调用someFunctionThatTakesAClosure函数:回调。
30                 myClosure!(string: "闭包传值\(temp)");
31             }
32     }
33 }
时间: 2024-12-17 14:25:57

SWIFT语言实现代理传值/闭包传值的相关文章

Swift语言实现代理传值

需求:利用代理实现反响传值(下面样例採用点击第二个视图控制器中的button来改变第一个视图控制器中的Label的内容) 一.创建RootViewController import Foundation import UIKit class RootViewController:UIViewController,ChangeWordDelegate{ var qzLabel:UILabel? override func viewDidLoad(){ super.viewDidLoad() sel

Swift 闭包传值

实现例子由两个界面组成 A  B 两个视图 A - > B 使用属性传值 B - > A 使用闭包进行反向回调传值 Swift 使用闭包传值的原理,与OC 中使用代码块(block)传值原理,基本类似 按步骤可以如下理解: 1.定义闭包. 2.闭包赋值(传送) 3.闭包调用. 想对于当前界面上执行某个操作,就在当前界面上定义, 比如:我想通过 B 界面回调 给 A 界面上的label赋值,赋值操作是在 A 界面上执行的.那么闭包就应该定义在 A 界面上.既然定义在 A ,那么 B 界面就是调用

swift开发使用闭包传值

swift开发使用闭包传值 开发中,从一个页面跳转到另一个页面的时候,有时候需要到跳转后的页面把值传回上一个页面,这里介绍一下swift开发中使用闭包传值 首先我们创建两个视图控制器分别为"ViewController"和"NextViewController" 现在我们要从"ViewController"跳转到到"NextViewController",然后在"NextViewController"里面把

使用Swift的代理,闭包来封装一个公用协议减少垃圾代码

iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题…… 比如说,我们先声网App中为了调用接口,做简单的判断,会有如下的垃圾代码(前辈遗留下来的): override func viewDidLoad() { super.viewDidLoad() var color = UIColor(red: 153/255, green: 204/255, blue: 204/255, alpha: 1) sel

苹果新的编程语言 Swift 语言进阶(六)--函数和闭包

一 .函数 1.1. 函数的定义和调用 函数的定义以func关键字作为前缀,接着是函数名字,接着跟着一个可以带有参数,也可以不带参数的圆括号,接着用-> 指示函数的返回类型.函数执行体用一对大括号{}包围.如下定义了一个函数名为sayHello的函数,该函数包含一个名字为personName,类型为String的输入参数. func sayHello(personName:String) -> String { let greeting ="Hello, " +person

Swift语言入门之旅 (翻译自《The Swift Programming Language》电子书)

关于Swift Swift是为IOS和OSX应用制定的新编程语言,吸取C和Objective-C语言的精粹,但不损失与C语言的兼容性.Swift采用安全编程模型.加入了各种现代编程语言特性,使得该语言更易被掌握.更具扩展性,用起来更有趣.Swift语言的奠基石是已经成熟的.并为大家所喜爱的Cocoa和Cocoa Touch框架,新语言使大家可以尽情畅想新软件开发的机遇. Swift沉积了多年的研发成果,苹果公司为提供高效Swift语言编译器.调试器和基础架构打下了坚实基础.我们使用Automat

Swift语言入门之旅

学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序开始的.那在 Swift,我们使用一句话来实现它: println("Hello, world") 如果你编写过C或者Objective-C语言,Swift中的这个语法看起来便很熟悉,这句话却是一个完整的程序 .你无须为了得到输入/输出或字符串处理去导入一个独立的功能库.编写全局代码通常用于程序的进入 点.你不需要写一个main函数,你也不需要为每个语句写个逗号作为结尾. 这个

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

Swift语言指南(十)--字符串与字符

原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String 类型表示,对应着 Character 类型值的集合. Swift 中的 String 类型为你的编程提供了一个高速的,兼容 Unicode规范 的文本处理方式.Swift 创建和处理字符串的语法轻量可读,与 C 语言的字符串语法颇为相似.字符串的拼接非常简单,只需将两个字符串用 + 运算符相加.字符串的值是否