swift--传值

一、通过属性传值

先了解下,在Swift语言中,访问修饰符有三种,分别为privateinternalpublic。同时,Swift对于访问权限的控制,不是基于类的,而是基于文件的。其区别如下:

private访问级别所修饰的属性或者方法只能在当前的Swift源文件里可以访问。
internal(默认访问级别,internal修饰符可写可不写)
internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
public:可以被任何人使用
场景一在ViewController中有一个self.nameTextField.text需要将值传递到FirstVC 中。
1、在ViewController中

storyboard获取FirstVC

  let storyboard = UIStoryboard(name: "Main", bundle:nil)
  let firstVC = storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as! FirstViewController
  firstVC.titleNameString = self.nameTextField.text
  self.navigationController?.pushViewController(firstVC, animated: true)

Segue 获取FirstVC

self .performSegueWithIdentifier("VCGoToFirstIden", sender: self.nameTextField.text)
//在这个方法中给新页面传递参数
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
 if segue.identifier == "VCGoToFirstIden"{
     let controller = segue.destinationViewController as! FirstViewController
     controller.titleNameString = sender as? String
   }
 }

2、在 FirstVC 中

class FirstViewController: UIViewController {

    var titleNameString :String?
    override func viewDidLoad() {
          super.viewDidLoad()
            print("string === \(self.titleNameString)");

}

二、通过Delegate传值

场景:ViewController 进入FirstVC 后,返回值到ViewController中。
在FirstVC中

// 定义协议内容
protocol FirstVCChangedTheValueDelegate{
     // 回调方法
    func sendValueToLastVC(msgString:String)
}

class FirstViewController: UIViewController {
       // 为什么 没有当初的 weak 呢?
      var delegate:FirstVCChangedTheValueDelegate?
      //  返回按钮回去的方法
      @IBAction func backUpVC(sender: AnyObject) {

      if (self.delegate != nil) {
          self.delegate?.sendValueToLastVC("passwordBackString")
        }
      navigationController?.popToRootViewControllerAnimated(true)

     }
  }

在ViewController 中

class ViewController: UIViewController,FirstVCChangedTheValueDelegate {}

// 进入FisrtVC的时候
firstVC.delegate = self

// MARK: 实现代理
func sendValueToLastVC(msgString: String) {
    print("我收到了\(msgString)")
}

三、通过NSNotificationCenter传值

通知这块的话,通知干某个事情相对来说,具体的传值的当然也可以,通过它的方法我们就一目了然啦
注册通知

 // 先自定义一个NSNoticeKey 
 let MyTestNSNoticeKey = "com.MyYang.testNSNoticeKey"
// 注册通知
   NSNotificationCenter .defaultCenter() .addObserver(self, selector: "addTestNoticeMethod:", name: MyTestNSNoticeKey, object: nil)

func addTestNoticeMethod(notice: NSNotification){
   print("收到通知了==\(notice.userInfo)")
   // 所需要的值就可以在这里收到了
}

发送通知

 NSNotificationCenter .defaultCenter().postNotificationName(MyTestNSNoticeKey, object: self,userInfo: ["one":"1"])

记得及时移除通知

 deinit{
    NSNotificationCenter .defaultCenter() .removeObserver(self)
}

四、通过闭包(Closure)传值

闭包这块有点难懂,先记录一个简单的传值吧,后期慢慢深入。 场景:ViewController 到 FirstVC ,然后反向传值回来。
在FirstVC

//类似于OC中的typedef
typealias getMyValueClosure = (myValueString:String)->Void

// 声明一个闭包
var myClosure :getMyValueClosure?

然后只要再返回的时候,或者说某个触发事件上处理下
   if (self.myClosure != nil){
        self.myClosure!(myValueString: "我要传的值")
   }

在ViewController

// 数据回传函数
func myClosureMethod(testStr:String)->Void{
    //这句话什么时候执行?,闭包类似于oc中的block或者可以理解成c语言中函数,只有当被调用的时候里面的内容才会执行
    print("Block 传值了==:\(testStr)")
}

进去FirstVC 的时候注意加上

// 这里把对象的指针传到第二个ViewController中 
// 在第二个ViewController中就可以间接控制这个对象了
controller.myClosure = myClosureMethod

另外像单例,NSUserDefaults也可以当做传值运用。而以上四种方式简单的介绍到这里,它们各有应用场景,我们可以根据具体的情况下自行选择吧,优缺点用多了就知道了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在我们开发中传值的方式有很多种,下面简单记录下我们常用的传值方式,像属性传值,代理,通知,闭包等等。 一、通过属性...
    天空中的球阅读 1,698评论 2 6
  • 文章内容: Swift中的常用传值方式 不同情况下视图的几种跳转方法详解 xib的使用 简单介绍一下单例设计模式 ...
    Hinsverson阅读 7,870评论 12 23
  • 本文将介绍swift中的传值方式:属性传值、代理传值、闭包传值、通知传值本文将在两个VC之间进行传值:HomeVC...
    初光夫阅读 1,702评论 0 52
  • 阴云,硝烟,巨炮轰鸣 颤抖吧,奥茨特里茨的土地 颤抖吧,欧罗巴的天空 在法兰西的愤怒之下 在自由的海啸中 杀戮仍在...
    王子魚阅读 702评论 44 33
  • 第四章 不一会儿同学们就都提议吃蛋糕:“灰鹭,啊,什么时候吃蛋糕啊,都饿死了!” “对啊”同学们一同回答。 “咱们...
    妍琦妹妹阅读 1,258评论 1 1