[ios][swift]使用swift闭包进行viewcontroller反向传值

闭包参考:http://c.biancheng.net/cpp/html/2285.html   闭包详解

传值参考:http://www.tuicool.com/articles/vy2uUz

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

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.
  }
  */

}
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.
  }
  */

}

  

时间: 2024-10-03 13:47:55

[ios][swift]使用swift闭包进行viewcontroller反向传值的相关文章

IOS开发语言Swift入门连载---闭包

IOS开发语言Swift入门连载-闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift 会为您管理在捕获过程中涉及到的所有内存操作. 注意: 如果您不熟悉捕获(capturing)这个概念也不用担心,您可以在 值捕获 章节对其进行详细了

Swift 闭包反向传值

Swift中闭包反向传值 1.第二控制器申明一个闭包类型 typealias BackBlock = (String) -> Void 2.第二控制器定义一个变量 var BackBlockClousure : BackBlock? 3.第一控制器实现回调 let VC = segue.destination as! DetailsViewController VC.BackBlockClousure = { (backStr:String) -> Void in NSLog(backStr,

iOS开发系列--Swift进阶

概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用Swift进行iOS开发还是不够的.在这篇文章中将继续介绍一些Swift开发中一些不常关注但是又必备的知识点,以便对Swift有进一步的了解. 访问控制 和其他高级语言一样Swift中也增加了访问控制,在Swift中提供了private.internal.public三种访问级别,但是不同的是Swift中的访问

IOS开发之SWIFT进阶部分

概述 上一篇文章<iOS开发系列--Swift语言> 中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用Swift 进行iOS开发还是不够的.在这篇文章中将继续介绍一些Swift开发中一些不常关注但是又必备的知识点,以便对Swift有进一步的了解. 访问控制 Swift命名空间 Swift和ObjC互相调用 Swift和ObjC映射关系 Swift调用ObjC ObjC调用Swift 扩展—Swift调用C 反

iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)

Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很多iOS开发者在知道Swift后,心中最大的问题就是如何将Swift应用到原有项目之中.下面我将简要介绍这2种语言的混用方法,内容参考自官方文档 Using Swift with Cocoa and Objective-C ,推荐大家阅读. 在Swift中使用Objective-C类 在Xcode6

iOS开发系列--Swift语言

Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了 ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在其中你可以看到C#.Java.Javascript.Python等多种语言的影子.同时在 2015年的WWDC上苹果还宣布Swift的新版本Swift2.0,并宣布稍后Swift即将开源,除了支持iOS.OS X之外还将支持linux. 本文将继续iOS开发系列教程,假设读者已经有了其他语言基础(强烈建

IOS开发语言Swift入门连载---属性

IOS开发语言Swift入门连载-属性 属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性可以用于类.结构体和枚举里,存储属性只能用于类和结构体. 存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类型属性. 另外,还可以定义属性监视器来监控属性值的变化,以此来触发一个自定义的操作.属性监视器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上. 存储属性 简单来说,一个存储属性就是

IOS开发语言Swift入门连载---基础部分

Swift >是 > iOS > 和 >OS X >应用开发的一门新语言.然而,如果你有 > C > 或者 > Objective-C > 开发经验的话,你会发现>Swift >的很多内容都是你熟悉的. Swift >的类型是在 >C >和 >Objective-C> 的基础上提出的,Int 是整型:Double 和Float 是浮点型:Bool 是布尔型:String 是字符串.Swift 还有两个有用的集合

swift开发使用闭包传值

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