码迷,mamicode.com
首页 > 编程语言 > 详细

Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值

时间:2015-11-25 22:00:56      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

一、第一个界面

//  Created by 秦志伟 on 14-6-13.
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.
  }
  */

}

二、第二个界面

//  Created by 秦志伟 on 14-6-13.
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.
  }
  */

}

Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值

标签:

原文地址:http://www.cnblogs.com/Free-Thinker/p/4995739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!