• IOS学习[Swift中跳转与传值]


    Swift中页面跳转与传值:

    1.简单方式

    首先,Swift的跳转可分为利用xib文件跳转与storyboard跳转两种方法,我这里选择使用storyboard的界面跳转方法。

    1、通过在storyboard中拉button控件建立segue跳转。

    2、通过presentViewController方法进行界面跳转。

    这里需要注意presentViewController方法适用于xib与storyboard两种方法,但是当使用storyboard直接调用该方法时,ios模拟器会转入一个黑屏界面,程序不会报错。

    主要原因是storyboard制作页面和手写页面,需要使用两种不同的方法来进行页面跳转。

    对于storyboard制作页面:

    var sb = UIStoryboard(name: "Main", bundle:nil)
    var vc = sb.instantiateViewControllerWithIdentifier("myViewController") as MyViewController
    self.presentViewController(vc, animated: true, completion: nil)
    

    对于手写页面:

    var vc = MyViewController()
    self.presentViewController(vc, animated: true, completion: nil)
    

    seuge跳转除了连线方式还有另外一种方法:

    performSegueWithIdentifier("SecondSegue", sender: self)

    其中利用sugue传值代码如下:

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            var des = segue.destinationViewController as! ViewController
            des.label = textF
        }
    

    2.利用协议protocol进行传值

     协议protocol指的是在类之间制定一套规定进行委托执行,一个类可以通过协议委托另外一个类执行方法

    protocol正向传值

    写好协议:

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

    ViewController:

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

    在NextViewcontroller中:

        //遵守协议必须重新实现一下协议中得方法
        func returnParams(tmpStr: String) {
            self.text2.text = tmpStr
        }
        override func viewDidLoad() {
        
            super.viewDidLoad()
            obj.paramsProtocolDelegate = self
            obj.start()
            
            // Do any additional setup after loading the view, typically from a nib.
        }
        
    

      

    4.利用NSUserDefaults进行传值

    NSUserDefaults能实现小容量的数据存储功能,常用于用户名密码保留等功能上,也可以用来传值。

    创建一个工具类:

    import Foundation
    //工具类,放置一些经常用到的方法
    //通过userDefault存储数据
    class baseClass{
        
        func cacheSetString(key: String,value: String){
            let userInfo = NSUserDefaults()
            userInfo.setValue(value, forKey: key)
        }
        
        func cacheGetString(key: String) -> String{
            let userInfo = NSUserDefaults()
            let tmpSign = userInfo.stringForKey(key)
            return tmpSign!
        }
    }
    

    ViewController:

     var base: baseClass = baseClass()
     
        }
        @IBAction func btn3Click(sender: AnyObject) {
            self.base.cacheSetString("sign", value: "通过NSUserDefaults传递方式3")
            self.performSegueWithIdentifier("btn3", sender: self)        
        }
    

    NextViewController:

        @IBOutlet weak var text3: UITextField!
        var base: baseClass = baseClass()
        var sign:String = String()
        override func viewDidLoad() {
            
            super.viewDidLoad()
            self.sign = base.cacheGetString("sign")
            text3.text = self.sign
            
            // Do any additional setup after loading the view, typically from a nib.
        }
    

      


    补充两种:

    4. 利用 self.storyboard

     

    利用 self.storyboard 方法, 就不需要进行 连线, 一样可以进行视图之间的跳转. 但是必须要设置 Storyboard ID.

     

    然后利用 如下方法进行 跳转 和 传值

     

    var thirdVC = self.storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as ThirdViewController
    thirdVC.text = "Pass"
    self.navigationController?.pushViewController(thirdVC, animated: true)
    

      

     

    因为是在 同一个 Storyboard 里面进行跳转, 所以 self.storyboard 就可以满足需求.

     

    不明白? 看最后一个方法:

     

    5. 利用 UIStoryboard

     

    XIB 方法, 我们需要 用到 nibName, 同样 如果我们想要 分离多个 sence 在不同的Storyboard 里面, 怎么办?

     

    这个时候, 就不能使用 self.storyboard 了.

     

    而是:

     

    var storyboard = UIStoryboard(name: "New", bundle: nil)
    var newVC = storyboard.instantiateViewControllerWithIdentifier("NewViewController") as NewViewController
    newVC.text = "Pass"
    self.navigationController?.pushViewController(newVC, animated: true)
    

      

    是不是 和 XIB 有异曲同工的感觉, 这样就可以把 Storyboard 分几个, 每个里面放几个 Sence.

     

    这样的好处就是, 当你需要做多个不同功能的模块的应用, 分离到不同的 Storyboard 中, 彼此互不影响.

     

    相对于 XIB 来说, 每个文件夹 只需要 1 个 Storyboard 文件, 和 Swfit 文件就可以了.

  • 相关阅读:
    mysql小数和类型转换函数
    concat()用法
    sql修改表名字段名
    having函数,case when与order by
    volatile实现原理与应用
    synchronized的实现原理与应用
    java8策略模式
    centos7快速升级gcc
    一个用户从发起请求到接收到响应,中间经过哪些服务,每个服务做什么事情
    Java注解
  • 原文地址:https://www.cnblogs.com/amourjun/p/amourjun.html
Copyright © 2020-2023  润新知