Woooowen You can do anything you set your mind to, man

Swift 中不用页面之间传值得两种方式

Notice: 12-10新增一种通过NSUserDefaults存储的方式传递值,个人觉得比较方便,更新到github上了.

应该还有一种通过消息传递,这里就不说了.就说说我觉得比较方便得2种方式

Github demo地址:https://github.com/woooowen/swiftSendParamsDemo 别忘记点个赞 :)

方法1

通过segue传值,这种传值方式一般只能通过跳转页面来传,即页面A跳转到页面B,那么可以将value从页面A传递到页面B中,是否可以跨页么我也没试过,菜鸟一个.写这个blog只是希望对新手朋友们有帮助,毕竟现在关于swift的知识还是比较缺少的

step1: 先对2个页面进行连接如图 img 并且将这个关联的identifier命名为btn1 或者其他,但是要跟代码中同步

step2:

    //通过segue 进行值传递
    @IBAction func btn1Click(sender: AnyObject) {
        self.tmpString = "通过segue进行的值传递方式1"
        self.performSegueWithIdentifier("btn1", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        //这边的btn1才是关联的identifier
        if segue.identifier == "btn1"{
            var obj = segue.destinationViewController as btn1 //这边的btn1名称 是你需要跳转的页面的ViewController
            obj.tmpString = self.tmpString
        }
    }

step3:

添加btn1 文件,这个时候执行,你就可以在btn1中println(self.tmpString)了,详见github

btn1.swift

import UIKit

class btn1: UIViewController {

    @IBOutlet weak var text1: UITextField!

    //这边需要定义一个变量
    var tmpString: String = String()
    override func viewDidLoad() {
        super.viewDidLoad()
        //输出传递过来得值
        text1.text = self.tmpString
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

方法2

通过delegate的方式进行页面传值,这个方法的好处就是可以在任意页面进行传递 什么是delegate,也就是为他人做嫁衣,自己帮别人实现方法.然后给别人去调用方法.

step1: 定义协议

protocol ParamsProtocol{
    //协议中得方法不能有结构体
    func returnParams(tmpStr: String)
}

在你的viewController中声明一个变量为协议类型

    var paramsProtocolDelegate: ParamsProtocol?

step2: 实现方法

在你的viewController中实现一个方法,里面给returnParams传递参数

    //定义一个方法给协议中得方法赋值
    //在viewController中实现方法,这样在btn1,btn2中就可以不用实现,帮他们2个实现了.这就是代理.
    func start(){
        self.tmpString = "通过delegate进行的值传递方式2"
        self.paramsProtocolDelegate?.returnParams(self.tmpString)
    }

step3:

添加文件btn2,在需要获取数据的class 里面重新定义returnParams方法,用来获取数据

btn2.swift

import UIKit
class btn2: UIViewController,ParamsProtocol {
    //该类需要遵守协议
    var tmpString: String = String()
    @IBOutlet weak var text2: UITextField!
    var obj = ViewController()

    override func viewDidLoad() {

        super.viewDidLoad()
        obj.paramsProtocolDelegate = self
        obj.start()

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //遵守协议必须重新实现一下协议中得方法
    func returnParams(tmpStr: String) {
        self.text2.text = tmpStr
    }
}

Woooowen 浙ICP备15013647号