swift--传值

作者: 爱吃鱼的小灰 | 来源:发表于2017-02-06 13:04 被阅读66次

    一、通过属性传值

    先了解下,在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也可以当做传值运用。而以上四种方式简单的介绍到这里,它们各有应用场景,我们可以根据具体的情况下自行选择吧,优缺点用多了就知道了。

    相关文章

      网友评论

      • 开发全靠xib:关于private的说法有点疑问。private应该是当前类可访问,file private才是当前文件可访问吧?
        爱吃鱼的小灰:@Noah1985 嗯嗯,我稍后做些修改!谢谢指正!
        Noah1985:@爱吃鱼的小灰 private变成类私有了,以前的定义被file private替代。
        爱吃鱼的小灰:@纳尼叫啥 是的,你说的没错呢,我写这些的时候看的不是最新版的,我刚看了一下这个file private是在3.0中的新的访问控制

      本文标题:swift--传值

      本文链接:https://www.haomeiwen.com/subject/qvoyittx.html