OC中Blocks反向传值和Swift中Closure反向传值的差别,下面直接贴上代码:
一、第一个界面
[objc] view plain copy- import UIKit
- class ZWRootViewController: UIViewController {
- init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
- super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
- // Custom initialization
- }
- var myLabel:UILabel?
- override func viewDidLoad() {
- super.viewDidLoad()
- var item = UIBarButtonItem(title:"下一页",style:UIBarButtonItemStyle.Plain,target:self,action:"nextBtnClicked")
- self.navigationItem.rightBarButtonItem = item
- myLabel = UILabel(frame:CGRectMake(0,100,320,50))
- myLabel!.text = "Closure"
- myLabel!.textAlignment = NSTextAlignment.Center
- self.view.addSubview(myLabel!)
- // Do any additional setup after loading the view.
- }
- func someFunctionThatTakesAClosure(string:String) -> Void {
- // function body goes here
- myLabel!.text = string
- }
- func nextBtnClicked(){
- let second = ZWSecondViewController(nibName:nil,bundle:nil)
- //将当前someFunctionThatTakesAClosure函数指针传到第二个界面,第二个界面的闭包拿到该函数指针后会进行回调该函数
- second.initWithClosure(someFunctionThatTakesAClosure)
- self.navigationController.pushViewController(second,animated:true)
- }
- override func viewWillDisappear(animated: Bool){
- myLabel!.hidden = true
- }
- override func viewWillAppear(animated: Bool){
- myLabel!.hidden = false
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- /*
- // #pragma 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.
- }
- */
- }
二、第二个界面 [objc] view plain copy
- import UIKit
- //类似于OC中的typedef
- typealias sendValueClosure=(string:String)->Void
- class ZWSecondViewController: UIViewController {
- var i:Int?
- //声明一个闭包
- var myClosure:sendValueClosure?
- //下面这个方法需要传入上个界面的someFunctionThatTakesAClosure函数指针
- func initWithClosure(closure:sendValueClosure?){
- //将函数指针赋值给myClosure闭包,该闭包中涵盖了someFunctionThatTakesAClosure函数中的局部变量等的引用
- myClosure = closure
- }
- init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
- super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
- // Custom initialization
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- i = 0
- var btn = UIButton.buttonWithType(UIButtonType.System) as?UIButton
- btn!.frame = CGRectMake(0,100,320,50)
- btn!.setTitle("点击我" ,forState:UIControlState.Normal)
- btn!.addTarget(self,action:"action", forControlEvents:UIControlEvents.TouchUpInside)
- self.view.addSubview(btn)
- // Do any additional setup after loading the view.
- }
- func action(){
- i = i!+1
- //判空
- if myClosure{
- //闭包隐式调用someFunctionThatTakesAClosure函数:回调。
- myClosure!(string: "好好哦\(i)")
- }
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- /*
- // #pragma 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.
- }
- */
- }