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

一篇文章学会页面传值的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, 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, 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, withEvent event: UIEvent?) {
          //MARK:实例化一个第二个界面的对象
        let svc = SubViewController()

        //给B页面传值,告诉B回传数据的目标是谁
        svc.vc = self

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

3、利用NSUserDefult双向传值

效果如下:

原理: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对象,然后读取数据,最后获取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, 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, 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, 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, withEvent event: UIEvent?) {
         //MARK:直接执行闭包
        self.dismissViewControllerAnimated(true, completion: nil)

        self.backValueclusore!(text:self.tf.text!)

文章转自 Demoer的简书

时间: 2024-10-12 09:19:38

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

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

一篇文章学会页面传值的10种方法(下) 6.代理委托实现页面之间的反向传值 这一种方法就是运用协议实现传值,这种方式也是在工程中常用的一种传值方法.首先创建好ViewController和SubViewController,在ViewController中创建好一个展示信息的Label,在SubViewController中创建好一个TextFeild,我们实现在第二个界面点击屏幕时,将TextFeild中的文字传到第一个界面,然后让背景颜色变色. 效果如下: 代理传值.gif 第一步: 首先我

javascript HTML静态页面传值的四种方法

一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm 1 代码如下: 2 3 <input type="text" name="username"> 4 <input type="text" name="sex"> 5 <input type="button" value="Post"> 6

ionic 跨页面传值的几种方法

1.使用AngularJS自带的$cacheFactory服务 $cacheFactory 从字面直译即为缓存工厂,可以用它来生成缓存对象,缓存对象以key-value的方式进行数据的存储,在整个应用内是单例的,可以在service或者controller中注入这个服务,然后就可以用它来自由的存取对象以及各种变量,下面是一个简单例子 [javascript] view plain copy .controller('AppCtrl', function ($scope, $ionicModal,

ios页面传值的几种方法

1.属性2.方法3.代理方法4.SharedApplication5.NSUserdefault6.通过一个单例的class来传递 属性这种方法传值挺方便的,只需要拿到它的指针,如果重新声明一个指针,就不是原来的内容,不是同一个指针,因此需要传指针. xxxViewController *document = [[xxxViewController alloc] initWithStyle:UITableViewStyleGrouped]; document.docDict = [self.da

一篇文章学会docker

一篇文章学会docker docker安装 docker在线安装 1.更新yum到最新 yum update 2.卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 3.安装需要的软件

页面传值的几种方式

1.使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案.使用这种方法的步骤如下: 1,使用控件创建web表单(form) 2,创建可以返回表单的按钮和链接按钮 3,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量 4,在保存的URL里添加QueryString参数

改善情绪的10种方法

10 Ways To Improve Your Mood改善情绪的10种方法Everyday productivity and efficiency practically depend on how you feel. More often than not, happy people are more effective at work and have better relationships. Of course, it is normal to be sad every once in

MVC控制器向View视图传值的三种方法

首先创建一个MVC的项目,其中需要一个控制器(TestController),三个视图(index,edit,detail) 1.项目结构如下: 2.控制器向视图传值的三种方法 1)提供视图模型对象(直接把对象放在View里面) 2)通过VewBag传递数据 3)通过ViewData传递数据 3.控制器源码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web;using Syste

html5中让页面缩放的4种方法

html5中让页面缩放的4种方法 2013-10-22 14:45:03 分类: Web开发 1.viewport这种方法,不是所有的浏览器都兼容 2.百分比这种方法,可以兼容大部分浏览器,但是修改幅度比较大.main .login .txt1{margin-top:8.59375%; position:relative;}3.css transform这种方法,可以兼容大部分浏览器,但是页面的位置是居中的.w320{transform: scale(1,1);-ms-transform: sc