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

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

推荐阅读更多精彩内容

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