一篇文章学会页面传值的10种方法(上)

1、最简单AB面正向传值

效果如下:

最简单的正向传值.gif

首先我们先创建两个视图控制器ViewController.swift和SubViewController.swift

设置第一个界面

首先在第一个界面创建好一个TextFeild,用来写我们要传的文字

import UIKit

class ViewController: UIViewController {

    let textField = UITextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        self.view.backgroundColor = UIColor.whiteColor()
        textField.frame = CGRectMake(7, 100, 400, 50)
        textField.borderStyle = .RoundedRect
        self.view.addSubview(textField)
    }
}

在这里我们设置当点击屏幕跳转到第二个界面
并且执行传值操作

在SubViewController里设置一个公开的属性去接收数据

var string: String?

在ViewController里设置点击屏幕时传值

 //当点击屏幕时执行该方法
 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
 
         //MARK:创建第二个界面的对象
        let svc = SubViewController()
        //MARK:通过属性来进行正向传值
        svc.string = self.textField.text


        //跳转到第二个界面
        self.presentViewController(svc, animated: true, completion: nil)
        
    }

在第二个界面里创建好一个label用来接收值

添加一个label控件

 //控件不公开
    private let textLabel = UILabel()
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.cyanColor()
        textLabel.frame = CGRectMake(7, 200, 400, 50)
        textLabel.textAlignment = .Center
        self.view.addSubview(textLabel)

在视图将要显示的时候将传进来的值赋值给控件

  
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        //在视图将要显示的时候,去将传进来的值,赋给控件
        self.textLabel.text = string
    }

当点击屏幕时,返回第一个界面

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        //返回上一页面
        self.dismissViewControllerAnimated(true, completion: nil)
    }

2、利用属性进行AB页面的反向传值

效果如下:

简单反向传值.gif

首先我们先创建两个视图控制器ViewController.swift和SubViewController.swift

第一步

在ViewController里面设置好一个固定的Label,设置显示的文字为:Location Services,和一个显示状态的statusLabel

第二步

在SubViewController里定义一个属性,去接收返回值的目标对象

var vc: ViewController?

然后放置一个UISwitch,设置开关的相应方法

    //设置开关的响应方法
    func swAction(sw:UISwitch){
    
        //判断状态
        if sw.on {
        
        //MARK:此步骤实现反向传值,将状态值回传给A页面
            self.vc?.lsStatusLabel.text = "ON"
        }else{
            self.vc?.lsStatusLabel.text = "OFF"
        }
    
    }

第三步

在ViewController里面设置touchBegan方法

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        //MARK:实例化一个第二个界面的对象
        let svc = SubViewController()
    
        //给B页面传值,告诉B回传数据的目标是谁
        svc.vc = self
        
        //点击屏幕时跳转到第二个界面
        self.presentViewController(svc, animated: true, completion: nil)
    }

3、利用NSUserDefult双向传值

效果如下:

NSUserDefault.gif

原理:NSUserDefaults是系统对plist文件封装好的一个类,我们可以通过这个类对文件进行读写,在在*HomeDirectory/Library/preferences/XXX.userdefaults.plist
*下。利用NSUserDefaults的特性,将某一个界面要传出的值存入到plist文件中,然后再另一个界面从plist文件读出来,就完成了传值操作

第一步

创建好ViewController和SubViewController

在ViewController中布局好Label的位置

第二步

在SubViewController中创建好5个按钮,为每个按钮添加tag值,并且实现交替选中效果,代码如下:

 for i in 0..<5 {
            let button = UIButton(type: .System)
            button.setTitle("第\(i + 1)个按钮", forState: .Normal)
            button.frame = CGRectMake(7, CGFloat(150 + i * 100), 400, 100)
            //为每一个button设置tag值
            button.tag = 100 + i
            //点击事件
            button.addTarget(self, action: #selector(self.buttonAction(_:)), forControlEvents: .TouchUpInside)
            self.view.addSubview(button)
        }

设置点击事件,实现交替选中效果

 for i in 0..<5 {
            let btn = self.view.viewWithTag(100 + i) as! UIButton
            btn.selected = false
        }
        sender.selected = true
        

在点击事件中同时使用NSUserDefaults将该按钮的tag值写入plist文件,做成数据记录
首先获取NSUserDefaults对象,这个对象是一个单例对象

let userDefaults = NSUserDefaults.standardUserDefaults()

将按钮的tag值做成数据记录

let selectedIndex = String(sender.tag)

写入plist文件

userDefaults.setObject(selectedIndex, forKey: "selectedIndex")

回写文件

userDefaults.synchronize()

第三步

从ViewController的viewWillAppear函数中我们读取plist文件,并完成反向传值

首先获取NSUserDefaults的对象
let userDefaults = NSUserDefaults.standardUserDefaults()

读取出数据,获取出SubViewController中对应button的tag值

let si = userDefaults.objectForKey("selectedIndex")

此时的si是AnyObject类型,我们将他转化成int类型

let tag = si?.intValue

然后修改ViewController中的label的文字

self.label.text = "第\(tag! - 99)个按钮是选中转态"

到这儿,就完成了反向传值的过程,第二个界面的哪个button被选中在第一个界面就会显示出来,效果如下

NSUserDefaults正向.gif

但是,再次从第一个界面跳回第二个界面是,按钮就变成全部为未选中状态,下面就是实现执行正向传值

同样是获取NSUserDefaults对象,然后读取数据,最后获取tag值找到对象button,设置该button为选中状态,在这儿还需读者自行去完成接下来的内容

4、使用系统闭包反向传值

这种方式是使用系统自带的闭包

self.presentViewController(UIViewController, animated: Bool) { 
          code
      }

这种传值方式传值会有延迟,因为是在执行完页面切换后再去进行传值
效果如下:


系统闭包传值.gif

第一步

首先创建好ViewController和SubViewController
viewController中布局好一个label用来显示接收到数据,在SubViewController中布局好一个TextFeild用来写数据

第二步

在SubViewController中创建一个接收属性

var vc: ViewController?

第三步

在ViewController中写touchBegan方法
获取第SubViewController对象,在presentViewController方法中打开闭包,在将ViewController传给SubViewController的vc

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let svc = SubViewController()
        //将视图控制器本身传过去,方便回传使用
        self.presentViewController(svc, animated: true) { 
            //这个方法是在弹出下一页面后执行
            svc.vc = self
        }
    }


第四步

在SubViewController中写touchBegan方法
在self.dismissViewControllerAnimated方法中打开闭包将属性tf中的文字回传给属性vc的textLabel

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.dismissViewControllerAnimated(true) {
            //利用这个闭包来回传数据
            self.vc!.textLabel.text = self.tf.text

        }
    }

5、自定义闭包传值

和使用系统闭包传值的思想相同,自定义闭包传值就是自己声明一个闭包,通过这个闭包来进行页面之间的相互传值
效果同第4种

第一步

创建好ViewController和SubViewController
分别在vc和subvc中布局好一个label和textFeild

在SubViewController中声明一个闭包

var backValueClusore:((text:String)->Void)?

第二步

在ViewController中写touchBegan方法
获取第SubViewController对象,在presentViewController方法中打开闭包,在将ViewController传给SubViewController的vc

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let svc = SubViewController()
        self.presentViewController(svc, animated: true, completion: nil)
        
        //MARK:将闭包中的text赋值给self.textLabel
        svc.backValueclusore = {(text:String)->Void in
            self.textLabel.text = text

    }


第三步

在SubViewController中写touchBegan方法
在self.dismissViewControllerAnimated方法中打开闭包将属性tf中的文字回传给属性vc的textLabel

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
         //MARK:直接执行闭包
        self.dismissViewControllerAnimated(true, completion: nil)
        
        self.backValueclusore!(text:self.tf.text!)

一篇文章学会页面传值的10种方法(下)

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

推荐阅读更多精彩内容