Swift 传值

在我们开发中传值的方式有很多种,下面简单记录下我们常用的传值方式,像属性传值,代理,通知,闭包等等。

一、通过属性传值

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

  • private访问级别所修饰的属性或者方法只能在当前的Swift源文件里可以访问。
  • internal(默认访问级别,internal修饰符可写可不写)
    internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
  • public:可以被任何人使用

场景在ViewController中有一个self.nameTextField.text需要将值传递到FirstVC 中。

1-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
       }
     }
    

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容